3
mysql> SELECT * FROM nodes
    -> WHERE hostName IN ('localhost', 'm1iafw') OR
    ->        address IN ('localhost', 'm1iafw');
+----------------------+-----------+-----------+
| id                   | hostName  | address   |
+----------------------+-----------+-----------+
|  9131891219333790492 | NULL      | m1iafw    |
| 15289714606300179720 | localhost | NULL      |
| 15886756565768587967 | m1iafw    | 10.7.7.12 |
| 18400354826544934228 | m1iafw    | NULL      |
+----------------------+-----------+-----------+

上記は、私が取り組んでいるクエリの簡略化されたバージョンです。INホスト名のリストを何度も繰り返す必要がないように、これを 1 つのオペレーターで書きたいと思います。リストには何百ものホスト名が含まれる可能性があります。

私が欲しいのは次のようなものです:

SELECT * FROM nodes
 WHERE (hostName, address) INTERSECTS ('localhost', 'm1iafw');

INTERSECT が提供するような一致する値のリストは必要ありません。INのようにブール値の結果が必要です。セットが交差するかどうか。

また、MySQL は INTERSECT 演算子をサポートしていません。いいえ。通常のアドバイスは、結合を使用して INTERSECT を別の形式に書き直すことですが、2 つのテーブルを交差させていないため、その方法がわかりません。

さらに、私が本当にやりたいことは、もう少し複雑です。上部のクエリからノードの ID 番号を指定して、一致するものを別のテーブルで検索したいと思います。3 つの列のいずれかに、一致する ID の 1 つが含まれている可能性があります。私の架空の INTERSECTS 演算子を使用すると、クエリを次のように記述できます。

SELECT * FROM alerts
 WHERE (analyzerNodeId, sourceNodeId, targetNodeId) INTERSECTS
           (SELECT id FROM nodes
             WHERE (hostName, address) INTERSECTS ('localhost', 'm1iafw'));

これを行う方法について何か提案はありますか? 私の SQL-fu はそれほど強力ではありません。

4

2 に答える 2

2

このようなタスクには、「一時」テーブルが必要です。mysql の場合、次のように作成できます。

select 'localhost' as hostname
union all
select 'm1iafw'
union all
select ....

したがって、ホスト名またはアドレスのいずれかがこのテーブルにあるすべての個別の ID を取得するには、結合構文を使用できます。

select id
from nodes as n
inner join (
    select 'localhost' as hostname
    union all
    select 'm1iafw'
) as q
on (n.hostName = q.hostname OR n.address = q.hostname)

次に、このクエリを次の操作のサブクエリとして使用できます。

SELECT *
FROM alerts as a
inner join
(
    select id
    from nodes as n
    inner join (
        select 'localhost' as hostname
        union all
        select 'm1iafw'
    ) as q
    ON (n.hostName = q.hostname OR n.address = q.hostname)
) as q2
ON (a.analyzerNodeId=q2.id OR a.sourceNodeId=q2.id OR a.targetNodeId=q2.id)
于 2013-11-08T17:24:35.037 に答える