[英]How do I order mysql query results by values from a joined table's rows (not columns)?
我有一個表items
和一個表parameters
。 item_parameters
表存儲項的每個可能參數的值,而不是為每個參數具有單獨的列。
例如(簡體):
parameters: items:
id: 1, name: color id: 1, name: bike
id: 2, name: size id: 2, name: phone
id: 3, name: weight id: 3, name: shoe
item_parameters:
id: 1, item_id: 1, parameter_id: 1, value: "blue"
id: 2, item_id: 1, parameter_id: 2, value: "large"
id: 3, item_id: 1, parameter_id: 3, value: "heavy"
id: 4, item_id: 2, parameter_id: 1, value: "black"
id: 5, item_id: 2, parameter_id: 2, value: "medium"
id: 6, item_id: 2, parameter_id: 3, value: "medium"
id: 7, item_id: 3, parameter_id: 1, value: "white"
id: 8, item_id: 3, parameter_id: 2, value: "small"
id: 9, item_id: 3, parameter_id: 3, value: "light"
如何搜索項目(對特定參數應用過濾器)並根據items
的特定parameter
value
對結果進行排序?
我知道如何使用帶有item_parameters.parameter_id = ? AND item_parameters.value = ?
的where子句來應用過濾器部分item_parameters.parameter_id = ? AND item_parameters.value = ?
item_parameters.parameter_id = ? AND item_parameters.value = ?
但是對於訂購部分,僅添加ORDER BY item_parameters.value desc
似乎不足以僅按那些item_parameters.value
進行訂購, where item_parameters.parameter_id = ?
。
在項目結果中,我希望該item
所有item_parameters
都包括order by子句中未使用的parameters
。
該查詢仍在進行中,因為我還沒有返回每個item
所有item_parameters
:
SELECT DISTINCT
`items`.name,
`parameters`.name,
`item_parameters`.value
FROM `items`
LEFT OUTER JOIN `item_parameters` ON `item_parameters`.`item_id` = `items`.`id`
LEFT OUTER JOIN `parameters` ON `item_parameters`.`parameter_id` = `parameters`.`id`
WHERE (item_parameters.parameter_id = 3 AND item_parameters.value = 'light')
ORDER BY item_parameters.value LIMIT 10000;
除了當前不返回所有item_parameters之外,此帖子上面的相關遺漏之處在於,訂單邏輯(偽代碼)需要為ORDER BY items_parameters.value where item_parameters.parameter_id = 1
這是預期結果的示例,並假設比上面提供的示例更大的示例數據集:
item name color size weight
cup brown small light
shirt green medium light
candy pink large light
chair tan medium light
paper white large light
請注意,所有結果均按參數3(權重)=淺色過濾,並按參數1(顏色)排序。
感謝您對此的任何指導。
我不確定這對性能最好,但是這就是我邏輯上構造查詢的方式。
首先選擇所有項目及其參數:
SELECT i.name, p.name, ip.value
FROM items i
JOIN item_parameters ip
ON ip.item_id = i.id
JOIN parameters p
ON p.id = ip.parameter_id
然后,確保您只有對於特定參數具有正確值的項目:
JOIN item_parameters ip3
ON ip3.parameter_id = 3
AND ip3.item_id = i.id
AND ip3.value = 'light'
然后包括您要訂購的參數:
JOIN item_parameters ip1
ON ip1.parameter_id = 1
AND ip1.item_id = i.id
然后添加ORDER BY:
ORDER BY ip1.value DESC, i.id, p.id
如果要按可能不存在的參數進行排序,則必須向左LEFT JOIN並選擇將生成的NULL值放在何處。
這也不會像您的示例結果所示那樣旋轉表,但是會很好地將項目分組在一起。
如果希望使用透視表,則可能必須分別連接所有參數,類似於上面的1和3。 您可以手動執行此操作,也可以通過從期望/必需參數列表中動態構建查詢來執行此操作。
更新
對於所示的關鍵結果,進行一些硬編碼:
SELECT i.name, color.value color, size.value size, weight.value weight
FROM items i
JOIN item_parameters color
ON color.parameter_id = 1
AND color.item_id = i.id
JOIN item_parameters size
ON size.parameter_id = 2
AND size.item_id = i.id
JOIN item_parameters weight
ON weight.parameter_id = 3
AND weight.item_id = i.id
WHERE weight.value = 'light'
ORDER BY color.value DESC
您可以加入參數表以獲取名稱,以防萬一它們發生更改,但這為您提供了一個輪廓。
這種方法的缺點是,每次添加新參數時都必須更新查詢。
我個人更喜歡使用組樣式方法,可以使用應用程序代碼生成數據透視表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.