我有一张桌子:
_d_d_
1
2
3
从这个表中,我希望得到特定lang的行和外部if,如果这个lang不存在外部if,我想要与任何其他lang一起的行。
子查询对表进行正确排序,但当我添加组by时,子查询的排序将丢失。这在较早的mysql版本中有效,但在5.7版本中不起作用。
(
SELECT
*
FROM
x
ORDER BY FIELD(lang, "fr") DESC, id
)
as y
group by externalid我希望查询返回id 2& 3的记录,因此对于每个不同的外部id,如果可能,lang = 'fr',否则任何其他lang。
我该如何解决这个问题?
发布于 2018-02-26 15:54:18
你说的是给定的externalid和land。因此,不需要按externalid分组;只使用一个where子句。
与ORDER BY和LIMIT相结合,您将得到所需的记录(即,如果存在这样的记录,则使用所需的语言,否则另一种语言)。
select *
from mytable
where externalid = 10
order by lang = 'fr' desc
limit 1;更新: Okay,根据您的评论,您希望每externalid获得“最佳”记录。在标准SQL中,您将为此使用ROW_NUMBER。其他DBMS还有更多的解决方案,例如甲骨文的KEEP FIRST或Postgre的DISTINCT ON。MySQL不支持任何这些。一种方法是使用变量来模拟ROW_NUMBER。另一种方法是将上面的查询用作每个externalid的子查询,以找到最佳记录:
select *
from mytable
where id in
(
select
(
select m.id
from mytable m
where m.externalid = e.externalid
order by m.lang = 'fr' desc
limit 1
) as best_id
from (select distinct externalid from mytable) e
);发布于 2018-01-25 14:47:22
子查询生成传递给外部查询的结果集(虚拟表)。
除非您在ORDER BY子句中完全指定顺序,否则所有SQL查询都会按照不可预知的顺序生成结果。
不可预知就像随机的,除了更糟。随机意味着每次运行查询时都会得到不同的顺序。不可预测意味着每次你都会得到相同的订单,直到你没有。
MySQL通常在子查询中忽略ORDER BY子句(有几个例外,主要与子查询LIMIT子句相关)。将ORDER BY移动到顶级查询。
编辑.您还误用了MySQL对GROUP BY的臭名昭著的非标准扩展。
https://stackoverflow.com/questions/48445480
复制相似问题