0

名前気分の2つの列しかないテーブルがあるとします。行には人の名前とその気分が保持されます。複数の気分がある場合は、複数の行がDBに格納されます。

たとえば、データベースには、幸せで、興奮し、誇りに思っているジョンがいます。

これは次のように表されます

John Happy
John Excited
John Proud

私がやりたいのは、満たされているいくつかの気分に基づいて名前を選択することです。UNIONに似ています:

SELECT name WHERE mood=Happy
UNION
SELECT name WHERE mood=Excited
UNION
SELECT name WHERE mood=Proud

ただし、上記の和集合を使用すると、次のようになります。

John
John
John

ユニオンはすべて、ジョンの単一の結果になりますが、クエリの1つにのみ一致する名前も選択します。

個々のmysql_resultリソース(私はPHPを使用しています)を取得し、一致する結果を探すいくつかのアルゴリズムを考えることができますが、知りたいのは、MySQLがすでにこれを容易にしているかどうかです。

上記はかなり漠然とした一般化であることに気づきました。言うまでもなく、私の実際のプログラムはかなり複雑であり、この質問のために少しおろそかにしました。遠慮なく質問してください。

4

5 に答える 5

2

重複がない場合は、サブクエリを使用して実行できます。

SELECT `name` FROM (
    SELECT `name`, COUNT(*) AS `count` FROM `moods`
    WHERE `mood` IN ('Excited', 'Happy', 'Proud') GROUP BY `name`
) WHERE `count` = 3

または、joinを使用することもできます。

SELECT `m1`.`name` FROM `moods` `m1`
JOIN `moods` `m2` USING (`name`)
JOIN `moods` `m3` USING (`name`)
WHERE `m1`.`mood` = 'Excited' AND `m2`.`mood` = 'Happy' AND `m3`.`mood` = 'Proud'

それほどかわいいわけではありませんが、LIMITを使用すると高速になる可能性があります。またはそうでないかもしれません。クエリプランナーに大きく依存します。

UPD:HAVINGについて思い出させてくれたTudor Constantinのおかげで、最初のクエリは次のようになります。

SELECT `name` FROM `moods`
WHERE `mood` IN ('Excited', 'Happy', 'Proud')
GROUP BY `name`
HAVING COUNT(*)>3
于 2012-01-21T10:53:07.570 に答える
0

私があなたの質問を正しく理解していれば、この場合、あなたは実際には必要ではなく、ステートメントUNIONに複数の条件が必要だと思います。WHERE

これを試して:

SELECT name, mood FROM myTable WHERE mood in ('Happy','Excited','Proud')

これにより、次の結果が得られます。

John, Happy
John, Excited
John, Proud

気分について複数の結果を得ることに関心がない場合は、次のことを試してください。

SELECT DISTINCT name FROM myTable WHERE mood in ('Happy','Excited','Proud')

これはただ与えるでしょう:

これにより、次の結果が得られます。

John

更新 すべての条件に一致させたい場合は、おそらく副選択を使用する必要があります。

SELECT DISTINCT name FROM myTable 
WHERE name IN 
    (SELECT name FROM myTable WHERE mood = 'Happy')
AND name IN
    (SELECT name FROM myTable WHERE mood = 'Excited')
AND name IN
    (SELECT name FROM myTable WHERE mood = 'Proud')
于 2012-01-21T10:45:22.193 に答える
0

UNIONをINTERSECTに置き換えます。

于 2012-01-21T10:45:28.187 に答える
0

試してみてください:

SELECT name FROM user_moods um1 
  INNER JOIN user_moods um2 ON um1.name = um2.name
WHERE um1.mood IN ('Happy','Excited','Proud')
GROUP BY um2.mood
HAVING COUNT(um2.mood) = 3 # the number of different moods
于 2012-01-21T10:53:43.633 に答える
0

あなたの質問はすでに正しいです。句ADDで検索した単語を使用して、追加の列を作成できます。WHERE

SELECT name,'Happy' as imood WHERE mood='Happy'
  UNION
SELECT name,'Excited' as imood WHERE mood='Excited'
  UNION
SELECT name,'Proud' as imood WHERE mood='Proud'
于 2012-01-21T11:07:54.443 に答える