2013-03-20 4 views
0

В настоящее время я пытаюсь создать запрос, чтобы я мог выводить полную информацию о группе, хранящейся в моей базе данных. В моей базе данных сейчас 5 таблиц, это bands, gigs, members, comments и tracks. То, что я хочу сделать, - это связать все данные из каждой таблицы с соответствующим диапазоном, указанным в переменной URL. Например:SQL-запрос нескольких таблиц в одном запросе

<cfquery datasource="#application.datasource#" name="get-details"> 
    Select * 
    From bands, gigs, members, comments, tracks 
    Where gig_bandid = URL.id and member_bandid = URL.id and comments_bandid = URL.id and track_bandid = URL.id 
</cfquery> 

Я хотел сделать это, потому что в настоящее время, у меня есть 4 отдельных запросов проверки каждой из четырех таблиц, чтобы увидеть, если у них есть какие-либо данные, содержащиеся на соответствие полосовой идентификатор одной представленной в URL. Проблема, которую я имею, это я хочу вывести все это в одном запросе, используя такие термины, как member_name, вместо того, чтобы использовать get-members.member_name. Я пробовал использовать JOIN, но безрезультатно. Я предполагаю, что работает только с использованием двух таблиц. При необходимости можно предоставить дополнительные данные.

+0

Структура таблиц, вероятно, будет хорошей. –

+0

Что вы подразумеваете под структурой таблиц? – Banny

+0

Я имел в виду структуру таблиц, в первую очередь: какие у них столбцы, типы данных для этих столбцов, первичные и внешние ключи, чтобы указать, как эти таблицы относятся друг к другу. –

ответ

3

Вы, безусловно, можете использовать JOINs - вам могут потребоваться ВЗГЛЯДЫ, если данные находятся в одной таблице, а не в другом.

SELECT * 
FROM bands b 
    JOIN gigs g on b.bandid = g.bandid 
    JOIN members m on b.bandid = m.bandid 
    JOIN comments c on b.bandid = c.bandid 
    JOIN tracks t on b.bandid = t.bandid 
WHERE b.bandid = URL.id 

Или вы можете использовать LEFT OUTER JOIN, если вы знаете, что данные в таблице диапазонов, но потенциально не в ваших других таблицах:

SELECT * 
FROM bands b 
    LEFT JOIN gigs g on b.bandid = g.bandid 
    LEFT JOIN members m on b.bandid = m.bandid 
    LEFT JOIN comments c on b.bandid = c.bandid 
    LEFT JOIN tracks t on b.bandid = t.bandid 
WHERE b.bandid = URL.id 
+0

Я думаю, что OUTER JOIN, вероятно, является ключом к успеху здесь. – jalynn2

+0

Я думаю, что второй, вероятно, лучший, как если бы они нажали на ссылку для группы, группа всегда будет присутствовать, но данные, такие как участники или треки, могут быть не такими, если они решили не добавлять эти данные. Спасибо за это. Отмечено правильно. – Banny

+0

@ LeeB - np, рад, что мы могли бы помочь. – sgeddes

1

Я думаю, что вы пошли в правильном направлении с JOIN заявление ,

Однако, чтобы присоединиться к 5 таблицам сразу, вы должны предоставить некоторые подходящие критерии, чтобы вы могли «присоединить» все эти таблицы.

Оператор будет похож на это:

SELECT * 
FROM bands AS b 
    JOIN gigs  AS g ON g.bandid = b.bandid 
    JOIN members AS m ON m.bandid = b.bandid 
    JOIN comments AS c ON c.bandid = b.bandid 
    JOIN tracks AS t ON t.bandid = b.bandid 
WHERE b.bandid = URL.id 

И критерии для вступления в bandid, который появляется во всех 5 таблиц (и это URL.id).

Как упоминалось выше, вы можете использовать INNER и OUTER версии JOIN. Вот статья, объясняющая разницу: http://www.wellho.net/mouth/158_MySQL-LEFT-JOIN-and-RIGHT-JOIN-INNER-JOIN-and-OUTER-JOIN.html

+0

Ваш ответ правильный, однако кто-то из вас побил вас, поэтому я правильно ответил на их ответ. Спасибо хоть. – Banny

+0

Это хорошо, надеюсь, что мой ответ тоже помог: p – GogromaT

+0

Да, это так! В принципе, если я поместил 'members' left join' bands', каждая группа появится, но будут отображаться только те элементы, которые соответствуют группам, и если бы я правильно присоединился, все участники отобразили, но не все группы, даже если не было ни одного матча. – Banny

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