1

我有一个查询如下:

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

我知道我可以在此处单独使用内部联接或 php 循环,但我有一些无法使用内部联接的查询,并且发生了与此类似的问题(我即将解释)。

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

如果有人可以提供帮助,将不胜感激!

4

3 回答 3

3

我认为这应该有效:

SELECT event FROM log
WHERE user IN
  (SELECT SUBSTRING(details,55) FROM log WHERE details LIKE 'ID: 308%')
于 2013-10-14T16:13:48.140 回答
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 决定在子查询中使用索引而不是主表,这通常是错误的(在大多数这样的查询情况下,子查询返回一小部分值)。

于 2013-10-14T16:14:19.933 回答
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))
于 2013-10-14T16:59:36.923 回答