2012-05-12 67 views
-3

您好,我需要編寫查詢的幫助。需要寫一個效率查詢

下面是我的數據庫結構

id name key value 
1 book1 key1 abc 
2 book2 key2 aaa 
3 book3 key5 abc 
4 book4 key3 abc 
5 book5 key2 aaa 
6 book6 key2 aab 
7 book7 key1 abc 
8 book8 key2 abc 
9 book9 key1 abc 
10 book10 key1 abc 

我需要那些書,其關鍵與價值ABC和KEY2與價值AAA組合鍵1。

所以應該返回其鍵2和值AAB不會返回

1 book1 key1 abc 
2 book2 key2 aaa 
5 book5 key2 aaa 
7 book7 key1 abc 
9 book9 key1 abc 
10 book10 key1 abc 

書。

P.s這只是一個示例結構,我已經證明了我的需要。其實我正在研究wordpress post meta table。

+0

你是舉例不同意你的描述。你是否希望書籍中的兩個條件都是真實的或兩種情況? –

+0

我想要兩本書的條件都是真的。我已經使用樞軸表來解決這個問題。 –

回答

1

我認爲,根據您的設計在在某些時間點,每本書會有幾個key + value對。這意味着您可能希望選擇幾個特定鍵具有某些特定值的書籍。

這可以用下面的SQL(對於給定的例子)來實現:

SELECT t.id,t.name,k.key1,k.key2 
    FROM test t 
    JOIN (SELECT t.id,k1.value AS key1,k2.value AS key2 
      FROM test t 
      LEFT JOIN test k1 ON t.id=k1.id AND k1.`key`='key1' 
      LEFT JOIN test k2 ON t.id=k2.id AND k2.`key`='key2' 
) k ON t.id = k.id 
WHERE k.key1='abc' OR k.key2 = 'aaa'; 

內部部分將創建在受試者鍵樞轉表,而外部部分將執行結果過濾。你可以玩這個設置here

雖然,對於這樣的設計,我會建議將主題中的表分成兩個獨立的表:booksparams。你可以觀察到這樣的設置here。 請注意,如果您要將篩選條件更改爲k.key1='abc' AND k.key2 = 'aaa',那麼您將只有book10匹配。

這個例子很簡單,但它給出了這個想法。

+0

我不能實際拆分表,因爲它是一個WordPress的默認值。感謝您的建議,它的工作 –

2
select id, name, key, value from <yourTable> 
where key = "key1" 
or (key = "key2" and value = "aaa"); 

您可能還想看看documentation

+0

這似乎爲我工作..我回來 –

+0

你能看到我的評論馬特答案下面。那可能嗎。 –

0

這是爲了檢查是否值有鍵1和ABC OR鍵和AAA,因此它可以返回鍵1和鍵2

SELECT * FROM table WHERE key = 'key1' AND value ='abc' OR key = 'key2' AND value = 'aaa' 
2
select 
    id, name, key, value from <table> 
where 
    (key = "key1" and value="abc") 
or 
    (key = "key2" and value = "aaa"); 
+0

我可以在他們之間使用AND。用例應該是我有一本2本書。它的key1應該有abc值,key2應該有aaa值。如果任何關鍵失敗,結果將失敗。那可能嗎。當然是 –

+0

。只需用AND替換外部OR。 – Matten

1
SELECT * FROM mytable 
WHERE key='key1' AND value='abc' 
UNION ALL 
SELECT * FROM mytable 
WHERE key='key2' AND value='aaa' 
+0

你見過Matten解決方案嗎?你認爲哪一個更快? –

+0

實際運行時間需要在大數據集驗證上進行比較。但我不希望看到有重大差異。 –