[英]MYSQL join, return first matching row only from where join condition using OR
我在使用特定的MySQL查詢時遇到問題。
我有table1
和table2
, table2
連接到table1
。
現在的問題是我將table2
連接到table1
時的條件如下:
SELECT
table1.*, table2.*
JOIN table2 ON ( table2.table1_id = table1.id
AND ( table2.lang = 'fr'
OR table2.lang = 'eu'
OR table2.lang = 'default') )
我需要它僅從table2
返回1行 ,即使對於正確的table1.id
可能存在許多table2
行,並且具有許多不同的語言環境。
我正在尋找一種只連接具有優先級語言環境的行的方法,首先檢查其中lang = something
,然后如果無法管理連接/返回任何內容,那么在lang = somethingelse
,最后是lang = default
。
FR,EU對於許多用戶而言可能是不同的,並且數據庫中的行對於許多不同的語言環境可能都存在。我需要選擇具有正確后備優先級的最合適的語言環境。
我嘗試使用GROUP BY table2.table1_id
進行上述查詢,但似乎可行,但是我意識到,如果稍后在表中輸入最佳匹配項(第一個OR)(較高的主ID),它將返回第二個或默認優先級按行分組
有小費嗎?
謝謝!
它似乎仍然沒有“知道” t1.id是什么:(
這是我的整個查詢之后的內容,它顯示了table1 = _product_sku,table2 = _product_sku_data,t1 = ps,t2 = psd
SELECT ps.id, psd.description, psd.lang
FROM _product_sku ps
CROSS JOIN
( SELECT lang, title, description
FROM _product_sku_data
WHERE product_sku_id = ps.id
ORDER BY CASE WHEN lang='$this->profile_language_preference' THEN 0
WHEN lang='$this->browser_language' THEN 1
WHEN lang='default' THEN 2
ELSE 3
END
LIMIT 1
) AS psd
編輯:
此版本使用變量在可用語言中提供某種排名。 表和測試數據不是來自原始問題,而是來自作為答案提供的查詢OP。
我嘗試時產生了預期的結果:
SELECT id, description, lang
FROM
(
SELECT ps.id, psd.description, psd.lang,
CASE
WHEN @id != ps.id THEN @rownum := 1
ELSE @rownum := @rownum + 1
END AS rank,
@id := ps.id
FROM _product_sku ps
JOIN _product_sku_data psd ON ( psd.product_sku_id = ps.id )
JOIN ( SELECT @id:=NULL, @rownum:=0 ) x
ORDER BY id,
CASE WHEN lang='$this->profile_language_preference' THEN 0
WHEN lang='$this->browser_language' THEN 1
WHEN lang='default' THEN 2
ELSE 3
END
) x
WHERE rank = 1;
舊版本無法正常工作,因為WHERE
子句中不知道ps.id
:
通過使用LIMIT 1
和定義的排序語言,這一行應該返回table1
的行與table2
的“最匹配”行:
SELECT t1.id, t2.lang, t2.some_column
FROM table1 t1
CROSS JOIN
( SELECT lang, some_column
FROM table2
WHERE table1_id = t1.id
ORDER BY CASE WHEN lang='fr' THEN 0
WHEN lang='eu' THEN 1
WHEN lang='default' THEN 2
ELSE 3
END
LIMIT 1
) t2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.