簡體   English   中英

MYSQL連接,僅使用OR從連接條件所在的位置返回第一個匹配行

[英]MYSQL join, return first matching row only from where join condition using OR

我在使用特定的MySQL查詢時遇到問題。

我有table1table2table2連接到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM