MySQL解决方案尚不支持“ LIMIT&IN / ALL / ANY / SOME子查询”

时间:2020-08-09 16:06:26

标签: mysql

由于某种原因,MYSQL在子查询中不支持LIMIT:

 SELECT m.* 
 FROM `my_table` m
 WHERE m.`id` IN (
   SELECT o.`id`
   FROM (SELECT DISTINCT i.`id`, i.`label`, i.`client`, i.`place`
     FROM `my_table` i
     ORDER BY i.`label`, -i.`client` DESC, -i.`place` DESC) o
   WHERE m.`label` = o.`label` LIMIT 1
 );

我尝试通过以下链接使用联接:INNER JOIN INSTEAD OF IN(LIMIT error),但未成功。有任何线索吗?谢谢。

1 个答案:

答案 0 :(得分:1)

由于子查询仅返回1行和1列,因此不需要IN
您可以使用=

 SELECT m.* 
 FROM `my_table` m
 WHERE m.`id` = (
   SELECT o.`id`
   FROM (
     SELECT DISTINCT i.`id`, i.`label`, i.`client`, i.`place`
     FROM `my_table` i
     ORDER BY i.`label`, -i.`client` DESC, -i.`place` DESC) o
   WHERE m.`label` = o.`label` LIMIT 1
 );

但是在编写时,您的查询使用LIMIT而不使用ORDER BY(在内部子查询中确实使用ORDER BY,这是没有用的)。 您是说要做这样的事情吗?

SELECT m.* 
FROM `my_table` m
WHERE m.`id` = (
  SELECT o.`id`
  FROM (
    SELECT DISTINCT i.`id`, i.`label`, i.`client`, i.`place`
    FROM `my_table` i
  ) o
  WHERE m.`label` = o.`label` 
  ORDER BY o.`label`, -o.`client` DESC, -o.`place` DESC
  LIMIT 1
);

按列的负值降序排序也等同于按升序排序,因此ORDER BY子句可以简化为:

ORDER BY o.`label`, o.`client`, o.`place`