0

データ:

"名前"、 "アート"、 "unterkunft_id"、 "optionen_id"
"FeWoüöä"、 "Ferienwohnung"、 "5"、 "2"
"FeWoüöä"、 "Ferienwohnung"、 "5"、 "4"
「ホテル」、「ホテル」、「3」、「3」
「ホテル」、「ホテル」、「3」、「4」

これを返すクエリ:

SELECT  `booking_unterkuenfte`.Name,  `booking_unterkunftart`.Art, booking_unterkuenfte_optionen . * 
  FROM booking_unterkuenfte, booking_unterkunftart, booking_unterkuenfte_optionen
  WHERE  `booking_unterkuenfte`.unterkunftsart_id = booking_unterkunftart.id
  AND booking_unterkuenfte_optionen.unterkunft_id = booking_unterkuenfte.id
  GROUP BY booking_unterkuenfte.id
  ORDER BY pos DESC , Name ASC 
  LIMIT 0 , 30

複数のオプションを選択すると、nullの結果が得られます。私は理由を知っていますが、修正する方法はわかりません:(

  SELECT  `booking_unterkuenfte`.Name,  `booking_unterkunftart`.Art, booking_unterkuenfte_optionen . * 
  FROM booking_unterkuenfte, booking_unterkunftart, booking_unterkuenfte_optionen
  WHERE  `booking_unterkuenfte`.unterkunftsart_id = booking_unterkunftart.id
  AND booking_unterkuenfte_optionen.unterkunft_id = booking_unterkuenfte.id
  AND booking_unterkuenfte_optionen.optionen_id =4
  AND booking_unterkuenfte_optionen.optionen_id =3
  GROUP BY booking_unterkuenfte.id
  ORDER BY pos DESC , Name ASC 
  LIMIT 0 , 30

両方のオプションがあるため、ホテルを返却する必要があります。どうすればこれを修正できますか?

4

1 に答える 1

0

もちろん、オプションは3または4のいずれかであり、両方ではないため、これら2つのANDは空のクエリと評価されます。テストするオプションの数がわかっている場合は、booking_unterkuenfte_optionenに対して複数のJOINを実行する必要があります。

SELECT  `booking_unterkuenfte`.Name,  `booking_unterkunftart`.Art,
   booking_unterkuenfte_optionen.* 
FROM booking_unterkuenfte, booking_unterkunftart,
     booking_unterkuenfte_optionen AS op1,
     booking_unterkuenfte_optionen AS op2
WHERE  `booking_unterkuenfte`.unterkunftsart_id = booking_unterkunftart.id

AND op1.unterkunft_id = booking_unterkuenfte.id
AND op1.optionen_id =4

AND op2.unterkunft_id = booking_unterkuenfte.id
AND op2.optionen_id =3

GROUP BY booking_unterkuenfte.id
ORDER BY pos DESC , Name ASC 
LIMIT 0 , 30

別の方法として、同じunterkunft_idに対して2回報告されるオプションがないと確信している場合は、それらをカウントすることです。optionenが(3、4)にあり、optionenの数が2である必要があります。(3,3)が存在できない場合、これは3と4の両方のエントリが見つかったことを意味します。

SELECT  `booking_unterkuenfte`.Name,  `booking_unterkunftart`.Art,
   COUNT(booking_unterkuenfte_optionen.unterkunft_id) AS matches
FROM booking_unterkuenfte
JOIN booking_unterkunftart ON (booking_unterkuenfte.unterkunftsart_id = booking_unterkunftart.id)
JOIN booking_unterkuenfte_optionen ON (booking_unterkuenfte_optionen.unterkunft_id = booking_unterkuenfte.id)
WHERE
    booking_unterkuenfte_optionen.optionen_id IN (3,4)
GROUP BY booking_unterkuenfte.id
HAVING matches = 2
ORDER BY pos DESC , Name ASC 
LIMIT 0 , 30

たとえば、短い名前とエイリアスを採用することをお勧めします

...booking_unterkunfte AS bu
JOIN booking_unterkunftart AS bua ON (...)
JOIN booking_unterkuenfte_optionen AS buo ON (buo.u_id = bu.id)
...
于 2012-07-19T07:03:42.837 に答える