Mysql запрос на выборку?

Доброго времени суток.


Сижу над запросом и уже походу мозг начинает тупить.


Есть две таблицы — таблица `p` со статьями и `pt` с метками. К каждой статье идет много меток в таблице `pt` связаны они по ключу `id_p` в каждой таблице.


Таблци `p`:
SELECT * FROM `p`<br/>

Результат:
id_p | p_title<br/>
________________<br/>
1 | статья 1<br/>
2 | статья 2<br/>
3 | статья 3<br/>
4 | статья 4<br/>
.....<br/>
262 | статья 262<br/>


Таблица `pt:
SELECT * FROM `pt` WHERE `id_p` = 262<br/>

Результат:
id_pt | id_p | pt_val<br/>
_______________<br/>
7403 | 262 | 556<br/>
7402 | 262 | 535<br/>
7401 | 262 | 4448<br/>
7400 | 262 | 4447<br/>
7399 | 262 | 4445<br/>


Вопрос. Как записать условие WHERE что бы при выборе с таблицы `p` выбирались все записи с метками 4447 и 4448, но не с 556 и 535?


Я делаю:
SELECT * FROM `p`<br/>
INNER JOIN `pt`<br/>
WHERE `id_p` = 262 AND `pt_val` = 4447 AND `pt_val` = 4448<br/>


Результата ноль строк. Но если делать через OR то получается две записи с соответствующими метками:
SELECT * FROM `p`<br/>
INNER JOIN `pt`<br/>
WHERE `id_p` = 262 AND (`pt_val` = 4447 OR `pt_val` = 4448)<br/>


Нужно получить один. Но при большом количестве записей в таблице `p` и меток в `pt` в результат попадают записи с `p` которые там не должно быть
  • Вопрос задан
  • 3280 просмотров
Пригласить эксперта
Ответы на вопрос 5
@edogs
Старая проблема и старое прямое решение — вложенные запросы.
select * from p where
id_p in (select distinct(id_p) from pt andpt_val in (4447 ,4448))
and
id_p not in (select distinct(id_p) from pt andpt_val in (556, 535))
Лефт джоин для выдирания сразу и pt значений можно добавить по вкусу.
Но эта штука будет тяжелой… но без смены структуры по другому никак.
Ответ написан
iStyx
@iStyx
За деревьями не видим леса? :) GROUP BY не отменили же вроде.

SELECT p.* FROM p
LEFT JOIN pt ON p.id_p=pt.id_p
WHERE p.id_p=262 AND pt_val IN (4447, 4448)
GROUP BY p.id_p
Ответ написан
Наверное, так проще всего два раза джойнить таблицу pt.
Ответ написан
И вообще, принято обозначать колонки так, а то у вас ничего не понятно:

Таблица articles
id
title

Таблица article_tags
id
article_id
value

SELECT DISTINCTROW
articles.id,
articles.title,
tags1.id as article_id (если нужно будет выгребать одноименные поля из разных таблиц)

FROM articles
LEFT JOIN article_tags AS tags1 ON articles.id = tags1.article_id
LEFT JOIN article_tags AS tags2 ON articles.id = tags2.article_id

WHERE articles.id = 262
AND tags1.value = 4447
AND tags2.value = 4448
Ответ написан
Комментировать
@Next_Alex
SELECT * FROM `p`
INNER JOIN `pt`
WHERE `id_p` = 262 AND `pt_val` IN (4447,4448)

так красивее вроде как
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы