2012-10-10 75 views
4

我有三个表MySQL的外键查询返回空

让我们一demo_organization ;

+--------------------+--------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+--------------------+--------------+------+-----+---------+----------------+ 
| id     | int(11)  | NO | PRI | NULL | auto_increment | 
| org_name   | varchar(100) | NO |  | NULL |    | 
| org_type   | varchar(100) | NO |  | NULL |    | 
| abn_acn_no   | varchar(100) | NO |  | NULL |    | 
| org_url   | varchar(120) | NO |  | NULL |    | 
| notes    | longtext  | NO |  | NULL |    | 
| city    | varchar(100) | YES |  | NULL |    | 

第二个是demo_user

mysql> desc demo_user ; 
+--------------------+----------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+--------------------+----------------+------+-----+---------+----------------+ 
| id     | int(11)  | NO | PRI | NULL | auto_increment | 
| user_name   | varchar(100) | NO |  | NULL |    | 
| first_name   | varchar(100) | NO |  | NULL |    | 
| middle_name  | varchar(100) | NO |  | NULL |    | 
| last_name   | varchar(100) | NO |  | NULL |    | 
| image    | varchar(10000) | YES |  | NULL |    | 
| password   | varchar(80) | NO |  | NULL |    | 
| role    | varchar(20) | NO |  | NULL |    | 
| org_name_id  | int(11)  | NO | MUL | NULL |    | 
| timezone_id  | int(11)  | NO | MUL | NULL |    | 

而第三个是demo_meeting;样子

mysql> desc demo_meeting ; 
+--------------------+--------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+--------------------+--------------+------+-----+---------+----------------+ 
| id     | int(11)  | NO | PRI | NULL | auto_increment | 
| name    | varchar(200) | NO |  | NULL |    | 
| meetingID   | varchar(50) | NO |  | NULL |    | 
| venue_id   | int(11)  | YES | MUL | NULL |    | 
| status    | int(11)  | YES |  | NULL |    | 
| recurring_time  | varchar(50) | NO |  | NULL |    | 
| attendee_passwd | varchar(100) | NO |  | NULL |    | 
| moderator_passwd | varchar(100) | NO |  | NULL |    | 
| date_created  | datetime  | NO |  | NULL |    | 
| start_time   | varchar(100) | NO |  | NULL |    | 
| end_time   | varchar(100) | NO |  | NULL |    | 
| meeting_duration | varchar(100) | NO |  | NULL |    | 
| meeting_datetime | datetime  | YES |  | NULL |    | 
| timezone   | varchar(50) | NO |  | NULL |    | 
| reminder   | tinyint(1) | NO |  | NULL |    | 
| duration   | varchar(20) | NO |  | NULL |    | 
| created_by_id  | int(11)  | NO | MUL | NULL |    | 

在第三个表created_by_id指demo_user表(外键)

而且org_name_id(demo_user表)指的用户到demo_organization(外键demo_organization表)

更新

mysql> desc demo_meetingroom; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(100) | NO |  | NULL |    | 
| type  | varchar(200) | NO |  | NULL |    | 
| expired_on | varchar(100) | NO |  | NULL |    | 
| user_id | int(11)  | YES | MUL | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

现在我试图获得一个特定组织的所有会议。

我写像

select meetingID ,type from demo_meeting as dm ,demo_meetingroom as dmr 
Where venue_id IS NOT NULL 
and dm.name = dmr.name 
AND created_by_id IN 
    ( 
    SELECT id from demo_user WHERE org_name_id IN 
     (
     SELECT id from demo_organization where id = 
      (SELECT org_name_id from demo_user WHERE user_name = 'God') 
     ) 
    ); 

查询不幸的是它返回我空集(但有值)

请帮我出什么可能我做错了吗?

+0

你已经描述了3个表,那么表“demo_meetingroom” – solaimuruganv

+0

检查更新了吗? – user1667633

回答

2

JOIN三个表,而不是这些IN的。例如:

SELECT 
    dm.meetingID, 
    dm.type 
FROM demo_meeting dm 
INNER JOIN demo_user   u ON dm.created_by_id = u.id 
INNER JOIN demo_organization org ON u.org_name_id = org.id 
WHERE u.user_name = 'God' 
AND dm.venue_id IS NOT NULL 
+0

不适合我吗? – user1667633

+0

@ user1667633 - 它如何不工作?如果要包含外表中不匹配的行,请尝试使用'LEFT JOIN'而不是'INNER JOIN'。 –

1

如果您可以使用JOIN会更好。

SELECT a.meetingID, d.type 
FROM demo_meeting a 
     LEFT JOIN demo_user b 
      ON a.created_by_id = b.id 
     LEFT JOIN demo_organization c 
      ON b.org_name_id = c.id 
     LEFT JOIN demo_meetingroom d 
      ON a.name = d.name 
WHERE a.venue_id IS NOT NULL AND 
     b.username = 'GOD' 
+0

ERROR 1054(42S22):未知列 '上子句' 在 'a.created_by_id' – user1667633

+0

'created_by_id'是上表'demo_meeting'。对? –

+0

是的,你可以在问题中看到.Kindly检查更新的问题也 – user1667633