|
|
|
| Здравствуйте.
Есть такая структура таблиц:
pages
id | title | text
tags
id | name
tags_pages
idTag | idPage
Содержание таблицы tags_pages:
idTag idPage
1 1
2 1
3 1
4 1
1 2
2 2
3 2
4 2
Выбрать страницы по id тега не составило труда, точно также как и теги по id страницы. Но запинка получилась, когда потребовалось выбрать набор страниц (набор id'шек страниц), который удовлетворяет нескольким тегам. Логическое И.
Пробую словесно: "Выбрать id страниц, где id тега равняется 1 И id тега равняется 2".
Пробую запрос: SELECT idPage FROM tags_depending WHERE idTag=1 AND idTag=2;
Да, я понимаю, что это не правильно, т.к. я требую, чтобы у таблицы было два столбца idTag и они соответствовали моему условию. Но... как иначе?
Ответ где-то на поверхности плавает, но видимо мало у меня практики в построении SQL запросов. Раньше использовал самые базовые возможности и с таким не сталкивался. | |
|
|
|
|
|
|
|
для: w1zard350
(25.08.2010 в 19:33)
| | мне кажется SELECT idPage FROM tags_depending WHERE idTag=1 OR idTag=2; нужно использовать как вложенный запрос, а из результирующей таблицы выбрать те id количество которых равно 2 применив группировку по id
___
хотя голова сейчас совершенно "не варит" | |
|
|
|
|
|
|
|
для: Valick
(25.08.2010 в 19:49)
| | От блин, еще не дочитал до вложенных запросов, следующая глава =) Сейчас почитаю, приду с новыми мыслями) | |
|
|
|
|
|
|
|
для: w1zard350
(25.08.2010 в 20:11)
| | Придумал я решение, но мне кажется должны быть более красивые способы. Идея в том, чтобы последовательно, путем вложения запросов исключать по одному тегу:
SELECT tags_pages.idPage
FROM tags_pages
WHERE tags_pages.idTag = 1
AND tags_pages.idPage IN (
SELECT tags_pages.idPage
FROM tags_pages
WHERE tags_pages.idTag = 2
);
|
Точно также, если нужно три тега:
SELECT tags_depending.idPage
FROM tags_depending
WHERE tags_depending.idTag = 1
AND tags_depending.idPage IN (
SELECT tags_depending.idPage
FROM tags_depending
WHERE tags_depending.idTag = 2
AND tags_depending.idPage IN (
SELECT tags_depending.idPage
FROM tags_depending
WHERE tags_depending.idTag = 3
)
);
|
Как видно, если нужно отобрать по 5-10 тегов, то совсем плохо получается. Пока буду использовать такой вариант, но все же надеюсь, что кто-либо решал подобную задачу и предложит свой вариант. | |
|
|
|