簡體   English   中英

努力將WHERE子句添加到INNER JOIN

[英]Struggling adding WHERE clause to INNER JOIN

我有一個查詢,應該從每個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子句,我將得到零結果:(任何幫助將不勝感激。

如果您的列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;

子查詢:

  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分組date_start, package_supplier, backend_hotels_id並且在SELECT列表列中沒有任何聚合函數: db_id, package_id, hotel_score

如果(date_start, package_supplier, backend_hotels_id)是“主鍵”或“唯一” (date_start, package_supplier, backend_hotels_id)則此查詢應保持一致。

該表的PRIMARY KEY是哪個,還有其他UNIQUE鍵嗎?

大家好,謝謝您的寶貴意見。 我已經解決了沒有子查詢的問題,並且它的工作速度也更快。

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類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM