| id | pid | idx | type | key | val |
|----+-----+-----+------+-----------+------------|
| 1 | 0 | | o | | |
| 2 | 1 | | s | time | 2010-... |
| 3 | 1 | | s | ip | 127.0.0.1 |
| 4 | 1 | | o | p | |
| 5 | 4 | | s | tape/id | 8abade... |
| 6 | 4 | | s | tape/page | http://... |
| 7 | 0 | | o | | |
| 8 | 7 | | a | foo | |
| 9 | 8 | 0 | s | | bar |
| 10 | 8 | 1 | o | | |
| 11 | 10 | | s | baz | quux |
| 12 | 4 | | s | tape/dref | x |
如果你看不清楚,可以在pastebin上找到它(http://pastebin.com/2RDn7ad0)。
好的,我有一个这样的数据库。它包含许多行(比上例中的要多得多)。我现在唯一关心的字段是tape / id和tape / dref。 现在,我至少有两个字符串。对于一个字符串,我有一个这样的查询:
select count(*) as count from (select distinct e.val from entries e where e.key='tape/id' and (select s.val from entries s where s.pid=e.pid and s.key='tape/dref')='x') q;
此查询可以正常工作。现在,我无法解决的问题是具有相同的查询,但它计算了存在两个或多个字符串的行数(在上面的示例中只有一个字符串“x”)。
谢谢!
答案 0 :(得分:2)
SELECT COUNT(DISTINCT eid.val)
FROM entries eid
JOIN entries edref
ON edref.pid = eid.pid
AND edref.key = 'tape/dref'
AND edref.val IN ('x', 'y')
WHERE eid.key = 'tape/id'
在UNIQUE INDEX
上创建entries(key, pid, val)
,以便快速开展工作。
答案 1 :(得分:1)
我可以建议在查询结尾处将='x'
替换为IN (list of values)
吗?
例如:... IN ('x', 'y', 'z')
答案 2 :(得分:0)
(其中e.key ='tape / id'或其中e.key ='tape / dref')AND(其中e.val ='x'或其中e.val = ???)