Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выборка записей по тегам
 
 автор: w1zard350   (25.08.2010 в 19:33)   письмо автору
 
 

Здравствуйте.

Есть такая структура таблиц:

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 запросов. Раньше использовал самые базовые возможности и с таким не сталкивался.

  Ответить  
 
 автор: Valick   (25.08.2010 в 19:49)   письмо автору
 
   для: w1zard350   (25.08.2010 в 19:33)
 

мне кажется SELECT idPage FROM tags_depending WHERE idTag=1 OR idTag=2; нужно использовать как вложенный запрос, а из результирующей таблицы выбрать те id количество которых равно 2 применив группировку по id
___
хотя голова сейчас совершенно "не варит"

  Ответить  
 
 автор: w1zard350   (25.08.2010 в 20:11)   письмо автору
 
   для: Valick   (25.08.2010 в 19:49)
 

От блин, еще не дочитал до вложенных запросов, следующая глава =) Сейчас почитаю, приду с новыми мыслями)

  Ответить  
 
 автор: w1zard350   (26.08.2010 в 00:31)   письмо автору
 
   для: 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 тегов, то совсем плохо получается. Пока буду использовать такой вариант, но все же надеюсь, что кто-либо решал подобную задачу и предложит свой вариант.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования