我遇到了特定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行,即使正确的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
答案 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
并按照定义排序语言,这个行应该返回table2
行LIMIT 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