在WHERE
上b.meta_key
謂詞是否定的LEFT的「outerness」 JOIN操作。
一種選擇是,該謂詞搬遷到ON
條款,例如:
SELECT a.user_id AS ID, a.meta_value AS color, b.meta_value AS size
FROM table AS a
LEFT JOIN table AS b ON a.user_id = b.user_id
AND b.meta_key = 'size'
WHERE a.meta_key = 'color' GROUP BY a.meta_value, b.meta_value
隨訪
問:如果color
不見了?
答:你需要一個表或內聯視圖作爲一個行源,它返回你想包含在結果集中的每個值user_id
。例如,如果你有一臺名爲「用戶」,每user_id
一行,並希望每一個id
該表中返回:
SELECT u.id AS user_id
, a.meta_value AS color
, b.meta_value AS size
FROM user u
LEFT
JOIN `table` a
ON a.user_id = u.id
AND a.meta_key = 'color'
LEFT
JOIN `table` b
ON b.user_id = u.id
AND b.meta_key = 'size'
GROUP
BY u.id
, a.meta_value
, b.meta_value
我們還注意到,在您的原始查詢的GROUP BY
做不包括user_id
列,因此任何具有相同顏色和大小的meta_value
的行都將摺疊,並且只會獲得具有匹配顏色和大小的user_id
值之一。
請注意,如果user_id
和meta_key
的組合是UNIQUE(在表table
中),那麼GROUP BY不是必需的。
在規範的關係模型中,實體的屬性實現爲列。作爲一個很好的例子,查詢返回的結果集看起來很像我們期望的表。
當在關係數據庫中實現實體屬性值(EAV)模型時,SQL的數量級變得更加複雜。
如果你想返回USER_ID的值只能是要麼color
或size
,你可以得到的user_id值的列表與內嵌視圖(針對table
查詢)。該查詢與上面相同,但有一個內嵌視圖替換參考user
表:
SELECT u.id AS user_id
, a.meta_value AS color
, b.meta_value AS size
FROM (SELECT t.user_id AS id
FROM table t
WHERE t.meta_key IN ('color','size')
GROUP BY t.user_id
) u
LEFT
JOIN `table` a
ON a.user_id = u.id
AND a.meta_key = 'color'
LEFT
JOIN `table` b
ON b.user_id = u.id
AND b.meta_key = 'size'
GROUP
BY u.id
, a.meta_value
, b.meta_value
OK,如果'color'缺什麼? – Xaver
@revaxarts:你需要一個「user_id」列的「源」,一個表或內聯視圖,保證返回你想要返回的每個'user_id'的值。我會通過後續更新我的答案。 – spencer7593
感謝您的回答。當顏色和大小都退出時,我想到了這個問題。在我的情況下,我根本不需要這個條目,所以第一個答案是正確的 – Xaver