2012-04-03 3 views
0

Я пытаюсь написать запрос MySQL, который дает мне результаты имени организации, ее Почтового кода, любых событий, принадлежащих Организации, и Почтового кода этого события. Я пробовал все виды объединения, объединения и выбора комбинаций безрезультатно. Это что-то возможно? (Я мог бы иметь отдельную таблицу для Org Адреса и события Адреса, но кажется, что это должно быть возможно использовать только одну таблицу)Запись запроса MySQL с несколькими объединениями таблиц или несколькими выборами

Моих структур таблиц:

mysql> DESCRIBE cc_organisations; 
+-------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| user_id  | int(10) unsigned | NO | MUL | NULL |    | 
| type  | enum('C','O') | YES |  | NULL |    | 
| name  | varchar(150)  | NO | MUL | NULL |    | 
| description | text    | YES |  | NULL |    | 
+-------------+------------------+------+-----+---------+----------------+ 
5 rows in set (0.00 sec) 

mysql> DESCRIBE cc_events; 
+-------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| org_id  | int(10) unsigned | NO | MUL | NULL |    | 
| name  | varchar(150)  | NO | MUL | NULL |    | 
| start_date | int(11)   | NO | MUL | NULL |    | 
| end_date | int(11)   | YES | MUL | NULL |    | 
| start_time | int(11)   | NO |  | NULL |    | 
| end_time | int(11)   | NO |  | NULL |    | 
| description | text    | YES |  | NULL |    | 
+-------------+------------------+------+-----+---------+----------------+ 
8 rows in set (0.00 sec) 

mysql> DESCRIBE cc_addresses; 
+--------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| org_id  | int(10) unsigned | YES | MUL | NULL |    | 
| event_id  | int(10) unsigned | YES | MUL | NULL |    | 
| post_code | varchar(7)  | NO | MUL | NULL |    | 
| address_1 | varchar(100)  | NO |  | NULL |    | 
| address_2 | varchar(100)  | YES |  | NULL |    | 
| town   | varchar(50)  | NO |  | NULL |    | 
| county  | varchar(50)  | NO |  | NULL |    | 
| email  | varchar(150)  | NO |  | NULL |    | 
| phone  | int(11)   | YES |  | NULL |    | 
| mobile  | int(11)   | YES |  | NULL |    | 
| website_uri | varchar(150)  | YES |  | NULL |    | 
| facebook_uri | varchar(250)  | YES |  | NULL |    | 
| twitter_uri | varchar(250)  | YES |  | NULL |    | 
+--------------+------------------+------+-----+---------+----------------+ 
14 rows in set (0.00 sec) 
+0

Вы отводите как org_ID и event_id в то же время, или они взаимно исключают друг друга в cc_addresses? –

ответ

2
select o.Name, oAddress.PostCode, e.Name, eAddress.PostCode 
from cc_organisations o 
inner join cc_addresses oAddress on oAddress.org_id = o.id 
left outer join cc_events e on e.org_id=o.id 
inner join cc_addresses eAddress on eAddress.event_id = e.id 
+0

Возможно, вам нужно проверить isnull (oAddress.event_id) на первом соединении в зависимости от того, могут ли одновременно быть установлены как event_id, так и org_id в cc_addresses. –

+0

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

+0

В качестве отправной точки обучения, в чем разница между SQL и этого: SELECT o.name, o_address.post_code, e.name, e_address.post_code ОТ cc_organisations AS о LEFT JOIN cc_addresses AS o_address LEFT OUTER JOIN cc_events AS Левом JOIN cc_addresses AS e_address ON o_address.org_id = o.id И e.org_id = o.id И e_address.org_id = e.id WHERE o.user_id = 1; –

0
SELECT cco.name as OrgName, cca.post_code as OrgPostCode, cce.id, 
     cce.org_id, cce.name, cce.start_date, cce.end_date, cce.start_time, 
     cce.end_time, cce.description 
FROM cc_events cce, cc_addresses cca, cc_organisations cco 
WHERE cca.event_id = cce.id AND cco.id=cce.org_id 
ORDER BY cce.start_date 
LIMIT 50; 

Вы можете измените свой вид и лимит, я просто добавил их, потому что я не знаю, насколько велик ваш БД ... Вы можете даже уйти от:

SELECT cco.name as OrgName, cca.post_code as OrgPostCode, cce.* 
FROM cc_events cce, cc_addresses cca, cc_organisations cco 
WHERE cca.event_id = cce.id AND cco.id=cce.org_id 
ORDER BY cce.start_date LIMIT 50; 

Но я не уверен на 100%, если второй запрос выйдет из строя или нет.

В таблице address есть почтовые коды; но он также имеет внешние ключи организации и идентификатор события. Нам нужно только проверить event_id из таблицы address, потому что любое событие будет принадлежать организации. Событие

  • Адрес в соответствие ID события
  • Организация мероприятий по организации соответствует ID
+0

С неявным внутренним соединением вы не увидите организаций без событий. Кроме того, этот запрос не будет возвращать адреса, привязанные специально к организации, но не к событию. (для этого нужно использовать cc_addresses.org_id) –

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