SELECT * FROM таблицы ГДЕ поле IN (идентификатор SELECT FROM таблицы ORDER BY field2) - PullRequest
1 голос
/ 31 августа 2010

У меня есть 4 таблицы:

categories - id, position
subcategories - id, categories_id, position
sub_subcategories - id, subcategories_id, position
product - id, sub_subcategories_id, prod_pos

Сейчас я делаю тесты, чтобы выяснить, что не так с моим запросом.

Итак, я хочу выбрать sub_subcategories и получить что-то вроде этого:

[[1,2,3,4,5,6], [1,2,3,4,5,6,7]], [[1,2,3,4,5,6], [1,2,3,4]]

Каждый [] означает: большие категории, маленькие - подкатегории, а числа - в подкатегориях. Я хочу, чтобы [] упорядочил их по полю "position", поэтому запрос:

SELECT id FROM sub_subcategories_id 
WHERE subcategories_id IN (
       SELECT id 
       FROM subcategories_id 
       WHERE categories_id IN (
            SELECT id FROM categories 
            WHERE id = 'X' ORDER BY position) 
            ORDER BY position) 
ORDER BY position

как-то не так, потому что я получаю:

1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,6,6,6,7

Не знаю, почему - последняя "позиция ORDER BY" уничтожает все?

Ответы [ 2 ]

4 голосов
/ 31 августа 2010

Вам необходимо применить все ваши желаемые упорядочения в самом внешнем запросе - ЗАКАЗ в подзапросах не имеет никакого смысла - вопрос "это идентификатор в <этот список>?" имеет один и тот же ответ, независимо от того, в каком порядке находится список (на самом деле, свойство more, <этот список> - это набор, у которого нет порядка).

Таким образом, вам нужно получить все столбцы, по которым вы хотите упорядочить свой самый внешний запрос.

Что-то вроде:

SELECT ssi.ID
from
    sub_subcategories_id ssi
        inner join
    subcategories_id si
        on
            ssi.subcategories_id = si.id
        inner join
    categories c
        on
           si.categories_id = c.id
where
    c.id = 'X'
order by
    c.position,
    si.position,
    ssi.position
0 голосов
/ 31 августа 2010

В нынешнем виде ваш запрос никогда не вернет «набор» чисел как есть. Если вы игнорируете все подвыборы, вы по существу делаете:

SELECT id FROM sub_subcategories_id 
ORDER BY position

, который возвращает только один столбец: sub_sub_categories_id. Тебе лучше сделать что-то вроде:

SELECT cat.id, subcat.id, subsubcat.id
FROM sub_sub_categories AS subsubcat
LEFT JOIN sub_categories AS subcat ON subcat.id = subsubcat.subcategories.id
LEFT JOIN categories AS cat ON cat.id = subcat.category_id
WHERE (cat.id = 'X')
ORDER BY cat.id, subcat.id, subsubcat.id

Это вернет 3 столбца, упорядоченных по различным идентификаторам. Если вам не нужны отдельные значения sub_sub_categories и вы просто хотите, чтобы они представляли собой одно строковое значение, вы можете возиться с GROUP_CONCAT() и выполнять различные операции группировки:

   SELECT cat.id, subcat.id, GROUP_CONCAT(subsubcat.id)
   FROM ...
   ...
   WHERE (cat.id = 'X')
   GROUP BY cat.id, subcat.id, subsubcat.id
   ORDER BY ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...