数据:
"Name","Art","unterkunft_id","optionen_id" "FeWo üöä","Ferienwohnung","5","2" "FeWo üöä","Ferienwohnung","5","4" "hotel","Hotel","3","3" "hotel","Hotel","3","4"
Query返回此:
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
应该返回酒店,因为它有两种选择。我怎样才能解决这个问题?
答案 0 :(得分:0)
当然,您选择的是3或4,从不两者,因此这两个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报告两次选项,那么就是计算它们。你需要选项在(3,4)中,并且选项的数量是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)
...