Php 如何通过多个ID从多个表中执行选择

Php 如何通过多个ID从多个表中执行选择,php,mysql,sql,Php,Mysql,Sql,我有3张表,看起来像这样: game_table +---------+------------+------------+----------------------+----------+ | game_id | game_title | sponser_id | game expiration date | prize_id | +---------+------------+------------+----------------------+----------+ prize_tab

我有3张表,看起来像这样:

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个表中选择所有数据的查询 请记住go类似于伪代码的语句:

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 ; 

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

您有一个
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 ;

根据您的描述,这些表可能是相关的。如果是,则需要使用联接,如下所示:

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

问题中的信息不足以确定游戏是否必须同时拥有赞助商和奖品。如果没有奖励或赞助商,内部连接可能会隐藏游戏行,这可能会让新加入RDBMS的开发人员感到困惑。这就是我建议使用外部联接的原因。我假设所有三个表中都有数据,并使用内部联接,出于性能原因,然后可能会添加一条注释,说明如果某些表没有相关数据,应该使用外部联接。因为OP在每个表上都提到了一个过滤器,所以我假设所有表都应该有数据。
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
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