2010-08-31 4 views
1

У меня есть 4 таблицы:SELECT * FROM таблицы WHERE поле IN (SELECT ID FROM таблицы ORDER BY field2)

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 положение" уничтожить все?

+0

как TIPP взглянуть на HTTP://dev.mysql.com/tech-resources/articles/hierarchical-data.html – teemitzitrone

ответ

4

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

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

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

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

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

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 ... 
Смежные вопросы