2014-01-17 11 views
0

У меня есть эти 3 таблицы:ВЫБРАТЬ в нескольких таблицах

POST [id_post, url] 
CAT [id_cat, name] 
POST_CAT [id_post, id_cat] 

У меня есть 10-15 категорий, а также между 100-200 URLs в каждой категории, но проблема в том, что URLs может иметь более чем одну категорию, то ... я хочу показать ВСЕ категории с 1 url, но этот url не может быть показан в других категориях

Как я могу это сделать?

У меня есть этот SQL, но, очевидно, не делать то, что я хочу:

SELECT c.nombre, p.url 
FROM post_cat pc, posts p, categorias c 
WHERE pc.id_post = p.id_post 
AND c.id = pc.id_cat 
GROUP BY pc.id_cat 

Спасибо и извините за мой плохой английский !!!

---------------------------------------------

Data (Example): 

CAT 1 - URL1, URL2 
CAT 2 - URL1, URL2 
CAT 3 - URL2, URL3 
CAT 4 - URL1, URL2 

Что это шоу:

CAT1 - URL1 
CAT2 - URL2 
CAT3 - URL3 

CAT4 - URL1 (причина URL1 и URL2 показано в других категориях ... показать 1 из них независимой, если повторяется или нет)

+0

Является ли c) опечаткой? Там не должно быть). – Devon

+0

отредактировал :) спасибо! – kaseOga

+0

Не могли бы вы предоставить некоторые примеры данных и ожидаемый результат? –

ответ

1

Если я правильно понимаю, вам нужен уникальный URL-адрес для каждой категории, где у этого URL нет других категорий. К сожалению, в SQL нет гарантированного решения. Но вы можете приблизиться.

Первое, что выбрать произвольную категорию для каждого URL:

select p.url, min(pc.id_cat) as id_cat 
FROM post_cat pc join 
    posts p 
    on pc.id_post = p.id_post 
GROUP BY p.url 
HAVING count(*) = 1; 

В having оговорка гарантирует, что существует только одна категория для url.

Далее, вы хотите, чтобы выбрать один из них для каждой категории:

select id_cat, min(url) as url 
from (select p.url, min(pc.id_cat) as id_cat 
     FROM post_cat pc join 
      posts p 
      on pc.id_post = p.id_post 
     GROUP BY p.url 
     HAVING count(*) = 1 
group by id_cat; 

Если вы хотите получить дополнительную информацию о категории (например, имя), а затем присоединиться в таблице категорий. ) p

+0

, которые показывают только 2 категории с разным URL, но только 2 категории, у меня есть 10-15 категорий aprox – kaseOga

+0

ok, это показывает все категории, у кого только 1 единственный URL, и мне это не нужно, но спасибо вам много :) – kaseOga

+1

@kaseOga. , , Вы можете удалить предложение 'having', если вы хотите разрешить URL-адреса с несколькими категориями. Это потому, что я понял этот вопрос. –

0

Попробуйте GROUP_CONCAT():

SELECT GROUP_CONCAT(c.nombre), p.url 
FROM post_cat pc, posts p, categorias c 
WHERE pc.id_post = p.id_post 
AND c.id = pc.id_cat 
GROUP BY pc.id_cat 

Это создает одно текстовое поле, содержащее все значения c.nombre, сгруппированные по вашему предложению GROUP BY.

Смотрите здесь для полной документации по этому поводу:

0

С помощью Присоединяется вы можете связать столько таблиц, сколько вам нужно. Объединение - это сердце реляционных дат.

Select c.nombre, p.url from post_cat pc join posts p on c.id=pc.id_cat 
join categorias c on pc.id_cat=c.id_cat 

Также рассмотреть использование Left Join, Right Join, Union.

+0

OP уже использует соединения с post_cat pc , сообщения p, categorias c. – Devon

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