所以我的格式为:
名称,网址,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。
希望这有助于提供更多数据。
答案 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 Bannister提交的答案的变体:
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