Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何按和分组;“更喜欢”;一排_Mysql_Sql_Group By - Fatal编程技术网

Mysql 如何按和分组;“更喜欢”;一排

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的位置,我理解为什么这不是我想要的行为,

我只是希望有一个SQL语句来对
分组,但是我希望它尝试并选择一行(如果该行可用)

例如,我有这样一句话:

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
相匹配的次表之间进行合并谢谢,这看起来非常合适!谢谢,这看起来很合适!