MySQL SubQueries多个结果

时间:2013-10-14 16:12:14

标签: php mysql sql

我的查询如下:

SELECT event 
FROM log
WHERE user = (SELECT SUBSTRING(details,55) FROM log WHERE details LIKE 'ID: 308%')

我知道我可以在这里单独使用内部联接或php循环,但我有查询,我不能使用内部联接和类似的问题发生(我即将解释)。

where子句的子查询返回许多电子邮件地址,然后我想调出与其中任何一个相关的任何日志事件。我的问题是然后我收到一条错误消息'Subquery返回超过1行'。

如果有人可以提供帮助,那将非常感激!

3 个答案:

答案 0 :(得分:3)

我认为这应该有效:

SELECT event FROM log
WHERE user IN
  (SELECT SUBSTRING(details,55) FROM log WHERE details LIKE 'ID: 308%')

答案 1 :(得分:2)

使用WHERE user IN <subquery>代替WHERE user = <subquery>

但是,根据我的经验,MySQL的IN <subquery>性能通常很差。这总是可以重写为JOIN,通常表现得更好。

这是您的示例查询重写为JOIN:

SELECT event
FROM log l1
JOIN (SELECT DISTINCT SUBSTRING(details,55) loguser
      FROM log
      WHERE details LIKE 'ID: 308%') l2
ON l1.user = l2.loguser

在这种特殊情况下,我怀疑表现会相似。 MySQL通常错误的地方是JOIN中的子查询返回索引列,并且您正在加入主表中的索引列。 MySQL决定使用子查询中的索引而不是主表,这通常是错误的(在大多数情况下,像这样的查询,子查询返回一小部分值)。

答案 2 :(得分:0)

您的另一个选择是使用EXISTS

SELECT `event`
FROM log
WHERE EXISTS(SELECT *
             FROM log AS log1
             WHERE log1.details LIKE 'ID: 308%'
               AND log.user = SUBSTRING(log1.details,55))