2

私は人の利用可能性の表を持っています:

         +---+---+---+---+---+---+
         | M | T | W | F | S | S |
         +---+---+---+---+---+---+
Olivier  |   |   |   |   | X | X |
         +---+---+---+---+---+---+
Georges  | X |   |   | X |   |   |
         +---+---+---+---+---+---+

だから私は3つのテーブルを持っています:

  • 可用性
  • person_availability

私は次のようなクエリを実行しています:

SELECT p.*
FROM person p
JOIN person_availability pa
ON p.id=pa.person_id
JOIN availability a
ON a.id=pa.availability_id
WHERE p.id = ?
AND a.day in (?)

動的パラメーターを使用します。例: param1=1および param2=(1,4,5)

問題は、このクエリがこれらの空室状況の 1 つで利用可能な人の行を返すことです。これらすべての空室状況で利用可能な人を持つように変更するにはどうすればよい(1,4,5)ですか?

4

2 に答える 2

0

aを実行してから、 内の値の数に等しい とGROUP BY p.id一致させます。このようにして、IN 句内にある各人の値を確実に取得し、3 つの値を指定して COUNT が 3 を返す場合、その人がすべての空き状況を持っていることがわかります。HAVING COUNT(a.day)IN (?)

そのようです:

SELECT p.*
FROM person p
JOIN person_availability pa ON p.id = pa.person_id
JOIN availability a ON a.id = pa.availability_id
WHERE p.id = 1 AND a.day IN (1,2,3)
GROUP BY p.id
HAVING COUNT(a.day) = 3;

sqlfiddle demo

于 2013-10-21T15:06:16.277 に答える