【问题标题】:mysql group by rowsmysql 按行分组
【发布时间】:2012-07-19 06:51:54
【问题描述】:

数据:

"姓名","艺术","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

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

【问题讨论】:

    标签: mysql join group-by where


    【解决方案1】:

    当然,您的选项是 3 或 4,绝不是 both,因此这两个 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)
    ...
    

    【讨论】:

    • booking_unterkuenfte_optionen IN (3,4) 必须是 booking_unterkuenfte_optionen.optionen_id IN (3,4) 但这是有效的。谢谢!
    • 对不起,将编辑。我纠结于所有这些选项 :-) -- 考虑使用别名来获得更短的名称!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多