2014-12-27 6 views
1

У меня следующие две таблицы. Мне нужно выбрать все лайтбоксы из lightboxes_tbl, где автор = «[email protected]». Это, очевидно, легкая часть. Где я застрял в том, что я также хочу выбрать в одном запросе количество активов в каждом лайтбоксе. Например, лайтбокс «воздушных типов» (id = 100/lightbox_id = 100) вернет 2 актива. Лайтбокс «maintenance» (id = 101/lightbox_id = 101) возвращает 1 актив.MySQL: возвращает количество строк из второй таблицы, используя один запрос

Спасибо!

lightboxes_tbl 
+-----+----------------+---------------+---------------------+ 
|id |lightbox_name |author   |authoried_viewers | 
+-----+----------------+---------------+---------------------+ 
|100 | aircraft-types |[email protected] |[email protected],[email protected] | 
+-----+----------------+---------------+---------------------+ 
|101 | maintenance |[email protected] |[email protected]  | 
+-----+----------------+---------------+---------------------+ 


lightbox_assets_tbl 
+-----+-------------+-------------+---------------+----------+ 
|id |lightbox_id |asset_name |asset_path  | asset_id | 
+-----+-------------+-------------+---------------+----------+ 
|1 |100   |a321.jpg  |project1/imgs/ | 3700  | 
+-----+-------------+-------------+---------------+----------+ 
|2 |100   |b757.jpg  |project1/imgs/ | 3444  | 
+-----+-------------+-------------+---------------+----------+ 
|3 |101   |engine.jpg |project4/imgs/ | 1444  | 
+-----+-------------+-------------+---------------+----------+ 

ответ

2

использования делают из LEFT JOIN и COUNT()

SELECT l.*, COUNT(a.lightbox_id) total_assets 
    FROM lightboxes_tbl l LEFT JOIN lightbox_assets_tbl a 
    ON l.id = a.lightbox_id 
WHERE l.author = '[email protected]' 
GROUP BY l.id 

Выход:

 
| ID | LIGHTBOX_NAME |  AUTHOR | AUTHORIED_VIEWERS | TOTAL_ASSETS | 
|-----|----------------|--------------|----------------------|--------------| 
| 100 | aircraft-types | [email protected] | [email protected],[email protected] |   2 | 
| 101 | maintenance | [email protected] |  [email protected] |   1 | 

Вот SQLFiddle демо

Рекомендуемая литература:

+0

Pefect, спасибо за рекомендуемое чтение. – azsl1326

+0

@ azsl1326 Конечно, проблем нет. Удачи :) – peterm

0

Вы, вероятно, хотите что-то вдоль линий этого запроса ...

ВЫБРАТЬ LBT.id, LBT.lightbox_name, LBT.author, LBTA.id, LBTA.asset_name, LBTA.asset_path, LBTA .asset_id иЗ lightboxes_tbl LBT РЕГИСТРИРУЙТЕСЬ lightbox_assets_tbl LBTA ON LBTA.lightbox_id = LBT.id WHERE автор = '[email protected]'

1

Присоединяйтесь к assts таблице:

select 
    lb.id, lb.lightbox_name, lb.author, lb.authoried_viewers, 
    sum(a.id is not null) asset_count 
from lightboxes_tbl 
left join lightbox_asset_tbl a 
    on a.lightbox_id = lb.id 
where author ='[email protected]' 
group by lb.id, lb.lightbox_name, lb.author, lb.authoried_viewers 

Там есть небольшой трюк: sum() используется, чтобы подсчитать, сколько строк не равно null в таблице asst, что приведет к получению нулевого значения для световых коробок, у которых нет активов - то, что count() не будет делать, когда используя левое соединение.

BTW, в mysql логический результат равен 1, если true, 0, если false, поэтому суммирование состояния аккуратно подсчитывает, сколько раз это было правдой.

0

azsl1326

это я пишу простой запрос, например, надеюсь, что это помогает,

выберите
A.id, a.lightbox_name, b.id, b.lightbox_id, б. asset_name, b.asset_id
из lightboxes_tbl в
присоединиться к lightbox_assets_tbl б
на (a.id = b.lightbox_id)
где a.author = «Скот @ ш. com "

Смежные вопросы