MYSQL连接,仅使用OR从连接条件返回第一个匹配行

时间:2010-03-08 14:24:24

标签: sql mysql

我遇到了特定MySQL查询的问题。

我有table1table2table2已加入table1

现在的问题是我加入table2table1的条件如下:

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行,即使正确的table2可能存在许多table1.id行,但有许多不同的区域设置

我正在寻找一种方法,只能连接一个具有区域设置优先级的行,首先检查一个lang = something,然后如果不能设置加入/返回任何内容,那么{{1最后lang = somethingelse

FR,EU对于许多用户可能有所不同,数据库中的行可能存在于许多不同的语言环境中。我需要选择具有正确回退优先级的最合适的行。

我尝试使用lang = default执行上面的查询,它似乎有效,但我意识到如果在表格中稍后输入最佳匹配(第一个OR)(更高的主要ID),它将返回第2个或默认优先级为按行分组..

任何提示?

谢谢!


它似乎仍然“不知道”t1.id是什么:(

以下是我的整个查询,它显示table1 = _product_sku,table2 = _product_sku_data,t1 = ps,t2 = psd

GROUP BY table2.table1_id

1 个答案:

答案 0 :(得分:4)

修改

此版本使用变量在可用语言中提供某种排名。表和测试数据不是来自原始问题,而是来自查询OP提供的as an answer

当我尝试它时,它产生了预期的结果:

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;

旧版本无效,因为ps.id条款中未知WHERE

通过使用table1并按照定义排序语言,这个行应该返回table2LIMIT 1的“最匹配”行:

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