Комплексный SQL объединяет несколько таблиц с несколькими условиями для всех таблиц. - PullRequest
0 голосов
/ 31 июля 2010

С учетом следующих таблиц:

labels              tags_labels  
|id   |name   |     |url   |labelid |  
|-----|-------|     |/a/b  |1       |  
|1    |punk   |     |/a/c  |2       |  
|2    |ska    |     |/a/b  |3       |
|3    |stuff  |     |/a/z  |4       |  

artists             tags  
|id  |name    |     |url   |artistid   |albumid  |  
|----|--------|     |------|-----------|---------|  
|1   |Foobar  |     |/a/b  |1          |2637     |
|2   |Barfoo  |     |/a/z  |2          |23       |  
|3   |Spongebob|    |/a/c  |1          |32       |

Я хотел бы получить список URL, которые соответствуют паре условий (которые могут быть введены пользователем в сценарий, который использует эти операторы). Например, пользователь может захотеть перечислить все URL, которые имеют метки «(1 ИЛИ 2) И 3», но только если они принадлежат исполнителям «Губка Боб ИЛИ Что угодно».

Возможно ли сделать это в одном выражении, используя внутренние / Гарри Поттер / Кросс / Self JOINs? Или мне придется распределить запрос по нескольким операторам и буферизировать результаты внутри моего скрипта?

Edit:
И если это возможно, как бы выглядело это утверждение? : Р

Ответы [ 2 ]

0 голосов
/ 31 июля 2010

Этот запрос позволит вам выполнить фильтрацию по имени метки или имени исполнителя.Динамическое построение sql для объединения пользовательских параметров или передача требуемых параметров в хранимую процедуру, очевидно, изменит предложения where, но это действительно зависит от того, насколько динамичным должен быть ваш «скрипт» ...

SELECT tl.url
FROM labels l INNER JOIN tags_labels tl ON l.id = tl.labelid
WHERE l.name IN ('ska','stuff') 
UNION (
SELECT t.url
FROM artists a INNER JOIN tags t ON a.id = t.artistid
WHERE a.name LIKE '%foo%'
)

ХорошоУдача!

0 голосов
/ 31 июля 2010

Да, вы можете сделать это одним запросом. И, возможно, эффективным способом было бы динамически генерировать оператор SQL на основе условий, введенных пользователем.

...