2014-02-11 3 views
0

1) У меня есть запрос для получения идентификатора файлов, например, так:MySQL - Сортировка по полю в нескольких выберите

SELECT virtuemart_media_id 
FROM __virtuemart_product_medias 
WHERE virtuemart_product_id = "1" 
ORDER by ordering ASC 

Это дает мне некоторые язей, как 23, 7, 8, 24 и то отлично.

Затем мне нужно использовать вышеуказанные значения в другом выражении WHERE, чтобы выбрать эти файлы. Поэтому у меня есть что-то вроде этого:

SELECT file_url, virtuemart_media_id 
FROM __virtuemart_medias 
WHERE virtuemart_media_id IN (
    SELECT virtuemart_media_id 
    FROM __virtuemart_product_medias 
    WHERE virtuemart_product_id = "1" 
    ORDER by ordering ASC 
) 

Это также работает, кроме я получил результаты файлов, которые имеют порядок: 7, 8, 23, 24 - так не в порядке 23, 7, 8, 24.

Где проблема? Похоже, что порядок внутреннего SELECT не сохраняется.

+0

Ну, разве вы не ответили на свой вопрос? Добавьте еще один 'ORDER BY'. Но, без обид, это немного уродливый способ написать запрос. Вам может быть интересно: http://dev.mysql.com/doc/refman/5.5/en//example-maximum-column-group-row.html – fancyPants

ответ

0

это заменит оба ваших запроса.

SELECT __virtuemart_medias.file_url, __virtuemart_medias.virtuemart_media_id 
FROM __virtuemart_medias INNER JOIN __virtuemart_product_medias ON 
__virtuemart_medias.virtuemart_media_id=__virtuemart_product_medias.virtuemart_media_id WHERE 
__virtuemart_product_medias.virtuemart_product_id = '1' ORDER BY 
__virtuemart_product_medias.ordering ASC 
0
SELECT a.file_url, a.virtuemart_media_id 
FROM __virtuemart_medias a 
INNER JOIN __virtuemart_product_medias b ON a.virtuemart_media_id = b.virtuemart_media_id 
ORDER BY b.ordering ASC; 

Это будет работать

0

Там нет порядка в предложении IN. Это всего лишь набор ценностей. x в (1,2,3) совпадает с x в (3,2,1) для (1,2,3), является тем же самым набором, что и (3,2,1). Присоединяйтесь к таблицам, чтобы получить доступ к вашему колонке заказа:

SELECT vm.file_url, vm.virtuemart_media_id 
FROM __virtuemart_medias vm 
INNER JOIN __virtuemart_product_medias vpm 
    ON vm.virtuemart_media_id = vpm.virtuemart_media_id 
WHERE vpm.virtuemart_product_id = 1 
ORDER BY vpm.ordering ASC; 
0

подзапрос для in может производить несколько результатов. В этом случае вы должны определить, какой из них вы хотите для заказа.

При замене in, за которым следует подзапрос с join, вы должны быть уверены, что вы случайно не умножаете количество записей. Для этого необходимо использовать агрегацию или distinct для удаления дубликатов:

SELECT m.file_url, m.virtuemart_media_id 
FROM __virtuemart_medias join 
    (select virtuemart_media_id, min(ordering) as ordering 
     from __virtuemart_product_medias 
     where WHERE virtuemart_product_id = 1 
     group by virtuemart_media_id 
    ) mi 
    on m.virtuemart_media_id = mi.virtuemart_media_id 
ORDER by mi.ordering ASC; 
Смежные вопросы