使用多个表连接或多个选择编写MySQL查询

时间:2012-04-03 13:41:06

标签: mysql join multiple-select-query

我正在尝试编写一个MySQL查询,它给出了组织名称,邮政编码,属于组织的任何事件以及该事件的邮政编码的结果。我尝试过各种各样的加入,加入和选择组合无济于事。这是可能的吗? (我可以为Org地址和事件地址设置一个单独的表,但似乎应该可以只使用一个表)

我的桌子结构:

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)

2 个答案:

答案 0 :(得分: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

答案 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表格中包含邮政编码;但它也有一个组织ID和事件ID外键。我们只需要检查event_id表中的address,因为任何事件都属于某个组织。

  • 地址事件匹配事件ID
  • 事件的组织与组织ID相匹配