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

如果我选择多个选项,我会得到空结果。我知道为什么但不知道如何解决:(

  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,而不是两者,因此这两个 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 报告两次选项,则可以计算它们。您要求 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 回答