2013-03-19 6 views
0

У меня есть небольшой запрос, он выглядит следующим образом:MYSQL GROUP_CONCAT и IN

Это немного сложнее, чем кажется, единственный вопрос, использует выход одного подзапроса в качестве параметра для пункта IN создать еще , Он работает в некоторой степени - но он дает только результаты от первого id в предложении «IN». Как ни странно, если я вручную вставляю идентификаторы записи «00003,00004,00005», это дает правильные результаты.

То, что я хочу сделать, это получить второй уровень от многих до многих отношений - в основном у тур_стопов есть предметы, которые, в свою очередь, имеют изображения. Я пытаюсь получить все изображения из всех элементов, которые будут в строке JSON, как «item_images». Как сказано, он работает быстро, но возвращает только изображения из первого связанного элемента.

SELECT DISTINCT 
    tour_stops.record_id, 
    (SELECT 
     GROUP_CONCAT(item.record_id) AS in_item_ids 
     FROM tour_stop_item 
     LEFT OUTER JOIN item 
     ON item.record_id = tour_stop_item.item_id 
     WHERE tour_stop_item.tour_stops_id = tour_stops.record_id 
     GROUP BY tour_stops.record_id 
     ) AS rel_items, 
    (SELECT 
     CONCAT('[ ', 
     GROUP_CONCAT(
     CONCAT('{ \"record_id\" : \"',record_id,'\", 
       \"photo_credit\" : \"',photo_credit,'\" }') 
     ) 
     ,' ]') 
     FROM images 
     WHERE 
     images.attached_to IN(rel_items) AND 
     images.attached_table = 'item' 
     ORDER BY img_order ASC) AS item_images 
    FROM tour_stops    
    WHERE 
    tour_stops.attached_to_tour = $record_id  
    ORDER BY tour_stops.stop_order ASC 

Оба этих ниже ответа я пробовал, но это не помогло. Второй пример (размещение всего первого подзапроса внутри оператора «IN») не только дает те же результаты, которые я уже получаю, но и увеличил время запроса экспоненциально.

EDIT: Я заменил мой IN заявление с

IN(SELECT item_id FROM tour_stop_item WHERE tour_stops_id = tour_stops.record_id) 

и она работает, но это жестоко медленно в настоящее время. Предполагая, что все правильно проиндексировано, это лучший способ сделать это?

using group_concat in PHPMYADMIN will show the result as [BLOB - 3B]

GROUP_CONCAT in IN Subquery

Любые идеи приветствуются. Спасибо

ответ

1

Я удивлен, что вы можете использовать rel_items в подзапросе.

Вы можете попробовать:

concat(',', images.attached_to, ',') like concat('%,', rel_items, ',%') and 

Это может или не может быть быстрее. Первоначально версия была быстрой, потому что совпадений нет.

Или вы можете попробовать изменить свой пункт in. Иногда они плохо оптимизированы:

exists (select 1 
     from tour_stop_item 
     where tour_stops_id = tour_stops.record_id and images.attached_to = item_id 
     ) 

И затем убедитесь, что у вас есть индекс по tour_stop_item(tour_stops_id, item_id).

+0

Это хорошо работает. Скорость сильно увеличилась с помощью «уникального» индекса. Благодарю. Точное изменение: SELECT GROUP_CONCAT (tour_stop_item.tour_stops_id) AS in_item_ids FROM tour_stop_item WHERE tour_stops_id = tour_stops.record_id GROUP BY tour_stops.record_id – dgig