2013-05-31 3 views
2

Я хочу выбрать результаты по нескольким таблицам, но я хочу только возвращать строки на основе результата COUNT() из присоединенного запроса SELECT.MySQL Присоединился к SELECT COUNT()

Вот как запрос выглядит на данный момент:

SELECT `s`.`venue_id` AS `id`, 
     CONCAT(`u`.`First_name`, ' ', `u`.`Surname`) AS `user_name`, 
     `u`.`avatar` AS `avatar`, 
     `u`.`facebookId` AS `fid`, 
     `x`.`imgs` AS `num_imgs` 
     FROM `new_shortlists_venues` `s` 
     INNER JOIN `new_shortlists` ON `new_shortlists`.`id` = `s`.`list_id` 
     INNER JOIN `users` `u` ON `u`.`id` = `new_shortlists`.`bride_id` 
     LEFT JOIN (SELECT `listing_id`, COUNT(*) `imgs` FROM `listingsImages`) `x` ON `s`.`venue_id` = `x`.`listing_id` 
     WHERE `new_shortlists`.`venues` > 4 
     AND `new_shortlists`.`bride_id` != 0 
     GROUP BY `s`.`list_id` 
     ORDER BY `s`.`date_added` DESC 
     LIMIT 6 

По какой-то причине, запрос возвращает NULL для num_imgs. По сути, я хотел бы выбрать только записи, которые имеют как минимум 4 записи в таблице listingsImages.

Обратите внимание, что это для устаревшей системы, и я не проектировал БД! В результате у меня есть теперь возможность изменить схему.

ответ

2

Вы остановились GROUP BY вашего подзапроса. Ваш текущий запрос возвращает COUNT(*), связанный со случайным listing_id. Добавьте GROUP BY listing_id, и вы должны вернуть правильные значения.

SELECT `s`.`venue_id` AS `id`, 
    CONCAT(`u`.`First_name`, ' ', `u`.`Surname`) AS `user_name`, 
    `u`.`avatar` AS `avatar`, 
    `u`.`facebookId` AS `fid`, 
    `x`.`imgs` AS `num_imgs` 
    FROM `new_shortlists_venues` `s` 
     INNER JOIN `new_shortlists` ON `new_shortlists`.`id` = `s`.`list_id` 
     INNER JOIN `users` `u` ON `u`.`id` = `new_shortlists`.`bride_id` 
     LEFT JOIN (SELECT `listing_id`, COUNT(*) `imgs` 
        FROM `listingsImages` 
        GROUP BY `listing_id`) `x` ON `s`.`venue_id` = `x`.`listing_id` 
    WHERE `new_shortlists`.`venues` > 4 
     AND `new_shortlists`.`bride_id` != 0 
    GROUP BY `s`.`list_id` 
    ORDER BY `s`.`date_added` DESC 
    LIMIT 6 

И вернуть те по крайней мере 4 записей, только добавить, что ограничение на ваши WHERE критериям:

AND `x`.`imgs` >= 4 
+0

Это здорово! Спасибо за вашу помощь. – BenM

+0

@BenM - np, рад, что я мог бы помочь! – sgeddes

0

Это может быть виновником:

ON `s`.`venue_id` = `x`.`listing_id` 
Смежные вопросы