Mysql 如何按和分组;“更喜欢”;一排
我只是希望有一个SQL语句来对Mysql 如何按和分组;“更喜欢”;一排,mysql,sql,group-by,Mysql,Sql,Group By,我只是希望有一个SQL语句来对分组,但是我希望它尝试并选择一行(如果该行可用) 例如,我有这样一句话: SELECT * FROM `translations` WHERE `lang` = "pl" OR `lang` = "en" GROUP BY `key` 在这条语句中,我试图选择lang为pl的所有位置,并且仅在对等的pl行没有结果的情况下获取en结果 key是在多个lang上相同的列 但是,如果我运行上述语句,所有结果都将出现在lang为en的位置,我理解为什么这不是我想要的行为,
分组,但是我希望它尝试并选择一行(如果该行可用)
例如,我有这样一句话:
SELECT *
FROM `translations`
WHERE `lang` = "pl" OR `lang` = "en"
GROUP BY `key`
在这条语句中,我试图选择lang
为pl
的所有位置,并且仅在对等的pl
行没有结果的情况下获取en
结果
key
是在多个lang
上相同的列
但是,如果我运行上述语句,所有结果都将出现在lang
为en
的位置,我理解为什么这不是我想要的行为,我不确定如何调整它
我知道如何通过编程实现这一点,但我认为只使用SQL会更整洁。不是最佳选择,但它应该会提供所需的结果:
SELECT a.*
FROM
(
SELECT * FROM `translations` where `lang` = "pl"
UNION ALL
SELECT * FROM `translations` a where `lang` = "en"
WHERE NOT EXISTS (SELECT NULL FROM `translations` b WHERE b.lang="pl")
)a GROUP BY `key`
这不是一个最佳方案,但它应该会产生预期的结果:
SELECT a.*
FROM
(
SELECT * FROM `translations` where `lang` = "pl"
UNION ALL
SELECT * FROM `translations` a where `lang` = "en"
WHERE NOT EXISTS (SELECT NULL FROM `translations` b WHERE b.lang="pl")
)a GROUP BY `key`
我会这样做:
SELECT COALESCE(`translation_foreign`.`value`, `translations`.`value`) AS `value`
FROM `translations`
LEFT JOIN `translation` as `translations_foreign` ON
translations_foreign.key = translations.key AND
translations_foreign.lang = "pl"
WHERE lang = "en"
GROUP BY `translations`.`key`
我会这样做:
SELECT COALESCE(`translation_foreign`.`value`, `translations`.`value`) AS `value`
FROM `translations`
LEFT JOIN `translation` as `translations_foreign` ON
translations_foreign.key = translations.key AND
translations_foreign.lang = "pl"
WHERE lang = "en"
GROUP BY `translations`.`key`
您可以将其表述为union all
语句。我的假设是,key
,lang
对唯一地标识一行(否则,您仍然可以执行groupby
,以获得每个键一行)
其思想是使用lang='pl'
选择所有行。然后为同一个键选择lang='en'
中没有与'pl'
对应行的行:
SELECT *
FROM translations
WHERE lang = 'pl'
union all
SELECT *
FROM translations
WHERE lang = 'en' and
`key` not in (select `key` from translations where lang = 'pl')
您可以将其表述为union all
语句。我的假设是,key
,lang
对唯一地标识一行(否则,您仍然可以执行groupby
,以获得每个键一行)
其思想是使用lang='pl'
选择所有行。然后为同一个键选择lang='en'
中没有与'pl'
对应行的行:
SELECT *
FROM translations
WHERE lang = 'pl'
union all
SELECT *
FROM translations
WHERE lang = 'en' and
`key` not in (select `key` from translations where lang = 'pl')
你说的groupby
是什么意思?我会以不同的方式构建它,在lang是en
的主表和可能匹配lang是pl
的次表之间进行合并,你说的groupby
是什么意思?我会以不同的方式构建它,在lang所在的主表en
和可能与lang所在的次表pl
相匹配的次表之间进行合并谢谢,这看起来非常合适!谢谢,这看起来很合适!