Mysql Query Incorporation Self Referential Join - PullRequest
       5

Mysql Query Incorporation Self Referential Join

2 голосов
/ 16 августа 2010

Скажем, у меня есть четыре таблицы:

------------- features --------------
id: int
name: varchar
-------------------------------------

-------- feature_categories ---------
feature_id: int
category_id: int    
-------------------------------------

----------- categories --------------
id: int
name: varchar    
-------------------------------------

------ category_subcategories -------
category_id: int
sub_category_id: int    
-------------------------------------

категория имеет много (под) категорий через подкатегории самоссылочного соединения

Функция имеет много категорий, некоторые из которых будут подкатегориямичерез объединение feature_categories

Мне нужно отправить массив идентификаторов функций и (основной) идентификатор категории и вернуть все подкатегории.Это оказалось сложнее, чем я ожидал, поэтому я очень признателен за любую помощь.Дайте мне знать, если этот вопрос не ясен.

РЕДАКТИРОВАТЬ Мне не нужно включать таблицу возможностей в любой запрос.В фасете мне требуется только вернуть поле имени подкатегории (категории).

Ответы [ 5 ]

1 голос
/ 19 августа 2010

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

 select f.name featureName, 
  c.name CategoryName, 
  c2.name SubCategoryName  
    FROM features f, feature_categories fc, categories c, category_subcategories sc, categories c2, feature_categories fc2
    WHERE f.id = fc.feature_id
    AND c.id = fc.category_id
    AND sc.category_id = c.id
    and c2.id = sc.sub_category_id
    and fc2.category_id = c2.id
    AND f.id in (0,1,2,...)
    and fc2.feature_id in (0,1,2,...)
    AND c.id = @main_category_id

или

    select f.name featureName, 
  c.name CategoryName, 
  c2.name SubCategoryName  
        FROM features f 
        inner join feature_categories fc on f.id = fc.feature_id
        inner join categories c on c.id = fc.category_id
        inner join category_subcategories sc on sc.category_id = c.id
        inner join categories c2 on c2.id = sc.sub_category_id
        inner join feature_categories fc2 on fc.category_id = c2.id

        WHERE f.id in (0,1,2,...)
        AND c.id = @main_category_id

        and fc2.feature_id in (0,1,2,...)
0 голосов
/ 24 августа 2010

Это может дать ожидаемый результат

select cat.name
  from categories cat,
       feature_categories feacat,
       category_subcategories cat_subcat
 where feacat.feature_id in (1,2,3)
   and feacat.category_id = cat.id
   and exists(select 1 
                from cat_subcat 
               where category_id = @catid 
                 and sub_category_id=cat.id
             )
0 голосов
/ 19 августа 2010
select f.name featureName, 
c.name CategoryName, 
c2.name SubCategoryName  
FROM features f 
inner join feature_categories fc on f.id = fc.feature_id
inner join categories c on c.id = fc.category_id
inner join category_subcategories sc on sc.category_id = c.id
inner join categories c2 on c2.id = sc.sub_category_id
inner join feature_categories fc2 on fc.category_id = c2.id and fc2.feature_id = fc.feature_id
WHERE f.id in (0,1,2,...)
AND c.id = @main_category_id;
0 голосов
/ 18 августа 2010
select f.name featureName,
  c.name CategoryName,
  sc.name SubCategoryName 
from features f
join features_categories fc on f.id=fc.feature_id
join categories c on fc.category_id=c.id
join category_subcategories cs on c.id=cs.category_id
join categories sc on cs.sub_categories_id=sc.id
WHERE f.id IN (0,1,2,...)

Если я правильно понимаю, что вы спрашиваете ...

0 голосов
/ 16 августа 2010

выполняет ли следующее работу?

SELECT *
FROM `category_subcategories` sc
  JOIN `categories` c ON sc.category_id = c.id
  JOIN `feature_categories` fc ON fc.category_id = c.id
WHERE fc.feature_id IN (0,1,2,...)
  AND c.id = main_category_id;
...