2011-11-11 34 views
0

我有3个表,看起来像这样执行从多个表中选择:如何通过几个IDS

game_table 
+---------+------------+------------+----------------------+----------+ 
| game_id | game_title | sponser_id | game expiration date | prize_id | 
+---------+------------+------------+----------------------+----------+ 
prize_table 
+----------+---------------------------+------------+-------------+--------------------+--------------------------------------------+ 
| prize_id | prize_image_name   | prize_cost | prize_title | remaining_quantity | prize_description       | 
+----------+---------------------------+------------+-------------+--------------------+--------------------------------------------+ 
sponser_table 
+------------+--------------+ 
| sponser_id | sponser_name | 
+------------+--------------+ 

如何建立查询选择从3个表中的所有数据 肉去的东西的声明像伪代码:

select all data from game_table and prize_table and sponser_table where game_table.sponser_id = 2 and game_table.prize_id = 2 

我想是这样的:

SELECT game_list.*, prize_list.* ,sponser_list.* FROM game_list, prize_list,sponser_list 
WHERE game_list.sponser_id=2 And game_list.prize_id = 2 And game_list.game_id=2 ; 

,但它没有给我带来好的结果。

回答

1

你有一个WHERE子句来限制正确的ID,但是你没有连接条件来关联你的表。取而代之的是隐式连接语法的你试图(以逗号分隔的表列表),使用一个明确的JOIN s的陈述与列:

SELECT 
    game_list.*, 
    prize_list.* , 
    sponser_list.* 
FROM 
    game_list 
    JOIN prize_list ON game_list.prize_id = prize_list.prize_id 
    JOIN sponser_list ON game_list.sponser_id = sponser_list.sponser_id 
WHERE game_list.sponser_id=2 And game_list.prize_id = 2 And game_list.game_id=2 ; 

我不推荐,虽然选择来自各表中的所有列,因为要复制的在至少两个地方的id列。相反,要明确你想要的列。如果稍后向这些查询中不应包含的表添加其他列,这也将对您有所帮助。

SELECT 
    game_id, 
    game_title, 
    game_list.sponser_id, 
    game_expiration_date, 
    game_list.prize_id, 
    prize_image_name, 
    prize_cost, 
    prize_title, 
    remaining_quantity, 
    prize_description, 
    sponser_name  
FROM 
    game_list 
    JOIN prize_list ON game_list.prize_id = prize_list.prize_id 
    JOIN sponser_list ON game_list.sponser_id = sponser_list.sponser_id 
WHERE game_list.sponser_id=2 And game_list.prize_id = 2 And game_list.game_id=2 ; 
0
SELECT 
    game_list.*, prize_list.* ,sponser_list.* 
FROM game_list 
JOIN prize_list ON game_list.prize_id = prize_list.prize_id 
JOIN sponser_list ON game_list.sponser_id = sponser_list.sponser_id 
WHERE 
    game_list.sponser_id=2 And game_list.prize_id = 2 And game_list.game_id=2 ; 
0

从你的描述看来,该表可能有关。如果是这样,你需要使用一个连接,像这样:

SELECT * 
FROM game_table g 
LEFT OUTER JOIN prize_table p ON p.prize_id=g.prize_id 
LEFT OUTER JOIN sponser_table s ON s.sponser_id=g.sponser_id 
WHERE g.game_id=2 
+0

为什么要使用一个左外连接? – Romain

+0

问题中的信息不足以确定游戏是否必须同时拥有赞助商和奖品。如果没有奖品或赞助商,内部加入可能会隐藏游戏行,这可能会让开发人员对RDBMS感到困惑。这就是为什么我建议使用外连接。 – dasblinkenlight

+0

我会假设所有三个表中都有数据,并且出于性能方面的原因使用内部联接,然后可能会添加一条评论,说如果某些表不能有相关数据,应该使用外部联接。由于OP在每个表格上都提到了一个过滤器,所以我会假设所有的数据都会有数据。 – Romain

1
SELECT * 
FROM game_table 
JOIN prize_table USING (prize_id) 
JOIN sponser_table USING (sponser_id) 
WHERE sponser_id = 2 
AND prize_id = 2 
AND game_id = 2