【问题标题】:Struggling adding WHERE clause to INNER JOIN努力将 WHERE 子句添加到 INNER JOIN
【发布时间】:2012-01-30 09:41:00
【问题描述】:

我有一个查询,它应该从每个 backend_hotels_id date_startpackage_supplier 中选择最低的 price_per_pax_after_tax,这似乎在我添加 WHERE 子句之前有效。

这是查询:

SELECT e.price_per_pax_after_tax, e.hotel_score, e.package_id, e.package_type
FROM packages_sorted_YQU e
INNER JOIN (
  SELECT db_id, MIN( price_per_pax_after_tax ) AS lowest_price, package_id, hotel_score
  FROM `packages_sorted_YQU`
  WHERE `package_type` IN ('9', '10', '18') 
  AND `package_duration` IN ('6', '8', '12')
  GROUP BY 
    `date_start` , `package_supplier` , `backend_hotels_id`
) AS j 
ON j.db_id = e.db_id
AND j.lowest_price= e.price_per_pax_after_tax
AND j.hotel_score = e.hotel_score
AND j.package_id = e.package_id;

表格很大,但列出的所有字段都是 INT,除了 date_start 是 DATE

导致问题的where子句是:

WHERE `package_type` IN ('9', '10', '18') 
AND `package_duration` IN ('6', '8', '12')

如果没有 where 子句,我会得到超过 400 个结果,而使用 where 子句,我会得到零个结果 :( 非常感谢任何帮助。

【问题讨论】:

  • 确定确实存在具有这些 ID 的包类型和持续时间?
  • 您希望得到多少结果?
  • 你需要得到多少结果
  • package_types 和 package_durations 确实存在于每个字段的至少一个 IN 参数中。例如package_type 10 AND package_duration 12 - 根据我的电子表格,我应该得到至少 200 个结果。
  • 最后,你只有SELECT * FROM packages_sorted_YQU WHERE package_type IN (9, 10, 18) AND package_duration IN (6, 8, 12)。运行此查询以确保确实有匹配的行。

标签: php mysql inner-join where-clause


【解决方案1】:

如果您的列 package_typepackage_durationint 类型,则您不必像字符串一样将值包装在 ' 中。

SELECT e.price_per_pax_after_tax, e.hotel_score, e.package_id, e.package_type
FROM packages_sorted_YQU e
INNER JOIN (
  SELECT db_id, MIN( price_per_pax_after_tax ) AS lowest_price, package_id, hotel_score
  FROM `packages_sorted_YQU`
  WHERE `package_type` IN (9, 10, 18) 
  AND `package_duration` IN (6, 8, 12)
  GROUP BY 
    `date_start` , `package_supplier` , `backend_hotels_id`
) AS j 
ON j.db_id = e.db_id
AND j.lowest_price= e.price_per_pax_after_tax
AND j.hotel_score = e.hotel_score
AND j.package_id = e.package_id;

【讨论】:

    【解决方案2】:

    子查询:

      SELECT db_id
           , MIN( price_per_pax_after_tax ) AS lowest_price
           , package_id
           , hotel_score
      FROM `packages_sorted_YQU`
      WHERE `package_type` IN ('9', '10', '18') 
      AND `package_duration` IN ('6', '8', '12')
      GROUP BY 
           `date_start` 
         , `package_supplier` 
         , `backend_hotels_id`
    

    无论有没有WHERE 子句,都会产生不确定的结果。因为您按date_start, package_supplier, backend_hotels_id 分组,并且在SELECT 列表列中没有任何聚合函数:db_id, package_id, hotel_score

    如果(date_start, package_supplier, backend_hotels_id) 是主键或唯一键,则此查询应该始终如一地工作。

    表的PRIMARY KEY 是哪个,还有其他UNIQUE 键吗?

    【讨论】:

      【解决方案3】:

      大家好,感谢您的宝贵意见。我已经在没有子查询的情况下解决了这个问题,而且它的工作速度也更快。

      SELECT MIN
      (
          concat
          (
              LPAD(`price_per_pax_after_tax` , 5, '0'),
              LPAD(`package_id` , 12, '0'),
              LPAD(`hotel_score` , 7, '0')
          )
      ) AS cat
      FROM `packages_sorted_YQU`
      WHERE `package_type` IN
      (
          9, 10, 18
      )
      AND `package_duration` IN
      (
          6, 7, 8
      )
      GROUP BY `date_start` , `package_supplier` , `backend_hotels_id`
      

      然后在 PHP 中,我将串联拆分为:

      while($r=mysql_fetch_array($q,MYSQL_ASSOC))
      {
          $a[lrp][] = intval(substr($r[cat], 0, 5));
          $a[package_id][] = intval(substr($r[cat], 5, 12));
          $a[hotel_score][] = substr($r[cat], 17, 7);
      }
      

      我很幸运,唯一的 FLOAT 值是 hotel_score,所以我把它放在最后——另外两个是 INT 类型

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 2010-11-04
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多