1

次のようなクエリがあります。

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

ここで内部結合またはphpループを個別に使用できることはわかっていますが、内部結合を使用できないクエリがあり、これと同様の問題が発生します(説明しようとしています)。

where 句のサブクエリは多くの電子メール アドレスを返すので、それらのいずれかに関連するログ イベントを表示したいと考えています。私の問題は、「サブクエリが複数の行を返す」というエラーメッセージが表示されることです。

誰かがそれを助けることができれば、それは大歓迎です!

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 に答える