SQL内部联接对子查询的限制不影响查询

时间:2019-03-04 10:26:38

标签: mysql

我正在使用INNER JOIN在MySQL中运行查询,该查询在子查询上具有LIMIT

问题是,子查询上的LIMIT正在影响返回的行数。

我想从表1(tickets)中选择所有行,其中ticket_updates中相关的最后一行(t.ticketnumber = tu.ticketnumber)在contact_name列中不是数字

SELECT t.* 
  FROM tickets t
  JOIN
     ( SELECT ticketnumber 
         FROM ticket_updates 
        WHERE type = 'update' 
          AND concat('', contact_name * 1) <> contact_name 
        ORDER 
           BY sequence DESC 
        LIMIT 1
     ) tu
    ON t.ticketnumber = tu.ticketnumber
 WHERE t.status <> 'Completed' 
   AND LOWER(t.department) = 'support';

但是显示的结果仅返回1行

根据ticket_updates ticket_updates.ticketnumber`

tickets中有多行与tickets.ticketnumber =中的每一行相关

contact_name列可以是字符串或整数。我从另一个SO Post上捡起concat('', contact_name * 1) <> contact_name,告诉我该值是否为数字。

所以我想为ORDER BY sequence DESC中的每一行选择ticket_updates中的最新行(tickets),并查看contact_name是否不是数字

1 个答案:

答案 0 :(得分:-1)

您的查询选择一行,因为(您自己得出结论)子查询仅限于一个结果。

您想要的内容可能类似于在this answer中可以找到的内容(我假设您想要具有sequence最大值的条目,如果矛盾,则更改为MIN

带有子查询(在引用的答案中应该有对最短,更优化的查询的改编,但让我们看看它是否首先起作用):

SELECT t.*
FROM tickets t
INNER JOIN ( SELECT ticketnumber, MAX(tu.sequence) AS maxSequence
        FROM ticket_updates tu
        WHERE tu.type = 'update' AND concat('', tu.contact_name * 1) <> tu.contact_name
        GROUP BY ticketnumber ) tu2
    ON (t.ticketnumber = tu2.ticketnumber)
WHERE t.status <> 'Completed' 
AND LOWER(t.department) = 'support';

see it in action