Php 将WHERE子句添加到内部联接
我有一个查询,应该从每个Php 将WHERE子句添加到内部联接,php,mysql,inner-join,where-clause,Php,Mysql,Inner Join,Where Clause,我有一个查询,应该从每个后端酒店id开始日期和包装供应商中选择每个人税后的最低价格,并且在我添加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_pric
后端酒店id
开始日期和包装供应商
中选择每个人税后的最低价格,并且在我添加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\u start
是date
导致问题的where子句是:
WHERE `package_type` IN ('9', '10', '18')
AND `package_duration` IN ('6', '8', '12')
如果没有where子句,我会得到400多个结果,而使用where子句,我会得到零个结果:(非常感谢您的帮助。如果您的列package\u type
和package\u duration
是int
类型,那么您不必像字符串一样将值包装在中
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;
子查询:
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\u start、package\u supplier、backend\u hotels\u id
分组的,并且在SELECT
列表列中没有任何聚合函数:db\u id、package\u id、hotel\u score
如果(开始日期、包装供应商、后端酒店id)
是主键或唯一键,则此查询应始终有效
哪个是表的主键
,还有其他唯一的
键吗?大家好,谢谢你们的宝贵意见。我不需要子查询就解决了这个问题,而且速度也快了一点
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);
}
我很幸运,唯一的浮动值是酒店评分
,所以我把它放在最后-另外两个是INT类型确保具有这些ID的包类型和持续时间确实存在?您希望得到多少结果?您需要多少结果来获取包类型和包持续时间至少存在于一个in参数中每个字段的ters。例如,package_type 10和package_duration 12-根据我的电子表格,我应该得到至少200个结果。最后,您所拥有的是从package_sorted_YQU中选择*FROM package_type In(9、10、18)和package_duration In(6、8、12)
。运行此查询以确保有实际匹配的行。