SQL Query用于在多个组中查找唯一值

时间:2012-03-20 16:02:59

标签: mysql sql

所以我的格式为:

  

名称,网址,xpath,值

问题是名称A,B和F有一个url U1和xpath X1是相同的(不关心值)。

  

名称C,D,E没有该URL U1或没有xpath X1。

     

名称B,C,D,E可以共享U2和X2

我正在尝试找到找到所有名称(A-F)中URL和xpath存在位置的最佳方法。

我不知道是否应该创建一个临时表,其中包含URL和xpath匹配的所有唯一值。然后使用该临时表遍历所有名称,如果所有名称都有该URL和Xpath,然后将其添加到第二个临时表,那么我将返回最终临时表中的所有结果。

谢谢!

以下是一些示例数据:

  

名称,网址,X路径,值

     

John,/ MyAttributes.xml,/ attribute / arms,2

     

John,/ MyAttributes.xml,/ attributes / legs,2

     

John,/ MyQualities.xml,/ qualities / race,human

     

Derek,/ MyAttributes.xml,/ attribute / legs,2   Derek,/ MyQualities.xml,/ qualities / race,non-human

因此名称可能会增长到数百个名称,而我想要收集的信息将是“/ MyAttributes.xml,/ attributes / legs”存在于John& Derek,随着db的增长,我仍然需要能够看到所有名称中存在哪个带有xpath的url。

希望这有助于提供更多数据。

4 个答案:

答案 0 :(得分:1)

试试这个:

select 
   url,
   xpath
from table
group by
   url,
   xpath
having
   max(case when name='A' then
         1
       else
         0
       end) +
   max(case when name='B' then
         2
       else
         0
       end) +
   max(case when name='C' then
         4
       else
         0
       end) +
   max(case when name='D' then
         8
       else
         0
       end) +
   max(case when name='E' then
         16
       else
         0
       end) +
   max(case when name='F' then
         32
       else
         0
       end) = 63;

答案 1 :(得分:1)

以下是Mark Ba​​nnister提交的答案的变体:

SELECT t.url
FROM
   myTable t
     CROSS JOIN (SELECT COUNT(DISTINCT name) AS cnt FROM myTable) x
GROUP BY t.url
HAVING COUNT(DISTINCT t.name) = MAX(x.cnt);

答案 2 :(得分:0)

要查找所有名称的所有网址,请尝试:

select url
from myTable
group by url
having count(distinct name) = (select count(distinct name) from myTable)

要查找所有名称都存在的xpath,请在上面的查询中交换xpath和url。

答案 3 :(得分:0)

所以这就是我最终做的事情。感谢所有帮助过的人。如果你知道一种优化的方法,那就太棒了。

总结一下,我最终创建了临时表。然后我会经历所有独特的结果。并查看所有唯一名称上是否存在该url + xpath。然后,如果它,我将它插入我的临时表,我只是在最后将其转储。

    BEGIN
    DECLARE bDone INT;

      DECLARE var1 VARCHAR(845);
      DECLARE var2 VARCHAR(45);
      DECLARE var3 VARCHAR(800);

      DECLARE curs CURSOR FOR SELECT DISTINCT CONCAT(url, xpath), url, xpath FROM myTable;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;


      DROP TEMPORARY TABLE IF EXISTS tblResults;
      CREATE TEMPORARY TABLE IF NOT EXISTS tblResults  (
        url VARCHAR(45),
        xpath VARCHAR(800)
      );
      OPEN curs;
      SET bDone = 0;
      REPEAT
        FETCH curs INTO var1, var2, var3;
        IF 
            (

            SELECT 
                COUNT(DISTINCT name) 
             FROM myTable as l 
             WHERE 
                l.url = var2 AND 
                l.xpath = var3
            ) = (

            SELECT 
                COUNT(DISTINCT name) 
                FROM myTable
            ) THEN

           INSERT INTO tblResults VALUES (var2, var3);
        END IF;
      UNTIL bDone END REPEAT;

      CLOSE curs;
      SELECT * FROM tblResults;
    END
相关问题