2013-10-14 148 views
1

我有一個查詢,如下所示:MySQL的子查詢多個結果

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

我知道我可以使用一個內連接或php環分開這裏,但我有類似這樣的疑問,我不能使用內部連接和存在問題發生(即將解釋)。

where子句的子查詢返回許多電子郵件地址,然後我想調出與其中任何一個有關的任何日誌事件。我的問題是我然後得到一個錯誤消息'子查詢返回多於一行'。

如果有人能幫助,將不勝感激!

回答

3

我認爲這應該工作:

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

'IN'是通常的方式做到這一點。 –

2

使用WHERE user IN <subquery>而不是WHERE user = <subquery>

但是,根據我的經驗,MySQL的IN <subquery>的性能通常很差。這總是可以重寫爲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決定在子查詢中使用索引而不是主表,這通常是錯誤的(在大多數情況下,像這樣的查詢,子查詢返回一小部分值)。

+0

你會如何用'JOIN'替換'IN'? –

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))