SELECT * FROM table WHERE field IN (SELECT id FROM table ORDER BY field2)

У меня 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]] 

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

 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» уничтожает все?

Вам необходимо применить все требуемые заказы в самом внешнем запросе – ORDERing внутри подзапросов не имеет никакого смысла – вопрос «это этот идентификатор в <этом списке>?»? имеет тот же ответ, независимо от того, в каком порядке находится список (действительно, больше свойства, <этот список> – это набор, который не имеет порядка).

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

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

 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 

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

 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 ...