2011-01-26 21 views
1
| 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)から入手できます。SQLクエリのヘルプ

私はそのようなデータベースを持っています。これには多くの行が含まれています(上記の例よりもはるかに多い)。私が気にしているフィールドは、tape/idとtape/drefだけです。 今、少なくとも2つの文字列があります。 1つの文字列の場合、次のようなクエリがあります。

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; 

今、私が解決できない問題は、同じクエリを持つことですが、与えられた2つ以上の文字列を持つ行の数を数えます(上記の例では、文字列 "x"は1つだけです)。

ありがとうございました!

答えて

1

='x'IN (list of values)に置き換えることをお勧めしますか?例えば

... IN ('x', 'y', 'z')

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' 

速く動作するように、このためentries(key, pid, val)UNIQUE INDEXを作成します。

0

(ここでe.key = 'tape/id'またはe.key = 'tape/dref')AND(e.val = 'x'またはe.val = ???)