2013-03-14 2 views
0

Допустим у нас есть таблица «страницы» с записямиSQL присоединиться 2 условием

|ID | Name | 
|1  | Test1| 
|2  | Test2| 

и «категория»:

|PAGE_ID| ID | NAME | 
|1  | 1 | Nice | 
|1  | 2 | Supper| 
|2  | 3 | Nice | 

Мне нужно, чтобы все страницы, которые принадлежат к категории «Nice "И" Ужин " в этом случае у нас есть 1 страница => Test1.

Можно ли это сделать в 1 SELECT с 1 соединением или подселекцией или вторым соединением? Лучше всего было бы, чтобы получить результат, как

|PAGE_ID | PAGE.NAME| CATEGORY.NAME_1 | CATEGORY.NAME_2 

, а затем просто подобрать правильную запись с простым где.

+0

Какой желаемый результат? – DevelopmentIsMyPassion

ответ

2
select 
    c1.page_id, p.name, c1.name, c2.name 
from 
    pages p 
    inner join 
    categories c1 on p.id = c1.page_id 
    inner join 
    categories c2 on p.id = c2.page_id 
where 
    c1.name = 'Nice' and c2.name = 'Supper' 
2

Вы можете сделать это, как этот

SELECT p.ID page_id, p.Name page_name, 'Nice' Category1, 'Supper' Category2 
    FROM categories c LEFT JOIN 
     pages p ON c.PAGE_ID = p.ID 
WHERE c.Name IN ('Nice', 'Supper') 
GROUP BY p.ID, p.Name 
HAVING COUNT(p.ID) = 2 

Выход:

| PAGE_ID | PAGE_NAME | CATEGORY1 | CATEGORY2 | 
----------------------------------------------- 
|  1 |  Test1 |  Nice | Supper | 

SQLFiddle

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

+0

это действительно умно! – Arbaaz

Смежные вопросы