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