2013-09-23 36 views
1

的多個行選擇條目我有一個數據庫兩個表:MYSQL:相對於另一個表

  • 條目(ID,距離,狀態[,...])
  • entriesmeta(ID, entry_ID,metakey,metavalue)

到現在爲止,我選擇的條目是這樣的:

SELECT ID, 
distance 
FROM entries 
WHERE status = '2' HAVING distance < 30 
ORDER BY distance 
LIMIT 20 

現在,第二個表包含這類數據:

ID | entry_ID | metakey | metavalue 
1 | 137  | service | 13 
2 | 137  | service | 7 
3 | 137  | service | 76 
4 | 84  | service | 23 
etc. 

第一個表中的條目是餐館,第二個表中的服務是他們提供的服務。我一直在嘗試的一段時間是:創建一個HTML搜索表單,讓用戶通過複選框選擇某些服務。然後,MYSQL查詢應該選擇提供所有這些服務的所有條目。到目前爲止,搜索表單將所選服務放在一個數組中(7,13,9,27)。

我的問題是找到正確的數據庫查詢。它應該將metavalue-field與checkbox-array匹配,然後從第一個表中選擇所有提供所有這些服務的條目。我一直在嘗試使用「LEFT JOIN ON entries.ID = entriesmeta.entry_ID」和幾個WHERE子句,但沒有成功。我想知道是否有人可以幫忙。

非常感謝您 - 抱歉我的英文不好。

+0

你可以發佈你現在的查詢語句嗎? – Maximus2012

+1

您可能想要使用此http://www.sqlfiddle.com/#!2/aef18/2(注意SQLFiddle演示基於用戶491243的anwser),以優化您希望兩個表中的記錄數量較高並刪除需要關閉「使用臨時的,使用filesort」什麼是真正的性能殺手的MySQL,因爲排序可以在磁盤上完成 –

回答

3
SELECT e.ID 
FROM entries e 
     INNER JOIN entriesmeta m 
      ON e.ID = m.entry_id 
WHERE 
     m.metakey = 'service' AND 
     m.metavalue IN (7,13,9,27) 
GROUP BY e.ID 
HAVING COUNT(DISTINCT m.metavalue) = 4 

該查詢將顯示所有ID具有的servicemetakey和一個值的7, 13, 9, 27小號)。

+0

爲什麼'具有計數(DISTINCT b.metavalue)= 4'? – AlexP

+0

@AlexP如果有可能'metavalue'不是唯一的。無論如何,如果它是唯一的,你可以簡單地刪除'DISTINCT'並將其改爲'HAVING COUNT(*)= 4' http://www.sqlfiddle.com/#!2/f2869/2 –

+0

我不需要DISTINCT ',因爲'metavalue'是唯一的。否則,這正是我所需要的。謝謝! –

2

這會讓你所有的entries有一個給定entriesmeta服務價值 - 這是我認爲你問的。

SELECT entries.* from entriesmeta 
INNER JOIN entries on entries.ID = entriesmeta.entry_ID 
WHERE entriesmeta.metavalue = <myValue> 
相關問題