С трудом добавляя предложение WHERE в INNER JOIN - PullRequest
0 голосов
/ 30 января 2012

У меня есть запрос, который должен выбирать самые низкие значения price_per_pax_after_tax из каждых backend_hotels_id date_start и package_supplier, и это работает до тех пор, пока я не добавлю предложение WHERE.

Вотquery:

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 я получаю ноль результатов :( Любая помощь будет очень признательна.

Ответы [ 3 ]

1 голос
/ 30 января 2012

Если ваши столбцы package_type и package_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;
0 голосов
/ 31 января 2012

Привет всем и спасибо за ваш ценный вклад.Я решил проблему без подзапроса, и он работает немного быстрее.

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

0 голосов
/ 30 января 2012

Подзапрос:

  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 ключи?

...