mysql按行分组

时间:2012-07-19 06:51:55

标签: mysql join group-by where

数据:

"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

应该返回酒店,因为它有两种选择。我怎样才能解决这个问题?

1 个答案:

答案 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)
...