MySQL连接三个表,每个

时间:2015-11-09 19:41:29

标签: php mysql codeigniter join

我需要将三个表连接在一起,并创建一个包含条件的大表。

我正在使用带有MySQL后端的Codeigniter。

考虑一个HTML表单,要求管理员输入项目ID。然后显示一个表,列出数据库中具有该特定ID的所有玩家。

考虑一个存储有关玩家信息的表,名为“玩家”:

userid   | username   | acct_id
 ---------------------------------
 5001     | user1      | 400000
 5002     | user2      | 400000
 5003     | user3      | 400001
 5004     | user4      | 400002
 5005     | user5      | 400003

考虑存储有关用户库存信息的第二个表,名为“库存”:

id  | userid  | item_id   | amount
 ------------------------------------
 1   | 5001    | 406       | 4
 2   | 5001    | 548       | 53
 3   | 5004    | 406       | 32
 4   | 5002    | 584       | 21
 5   | 5004    | 423       | 1
 6   | 5002    | 406       | 93

考虑存储有关用户“保管库”的信息的第三个表,名为“vault_inventory”:

id  | userid  | item_id   | amount
 ------------------------------------
 1   | 5004    | 548       | 4
 2   | 5002    | 406       | 29
 3   | 5005    | 406       | 43
 4   | 5003    | 432       | 54
 5   | 5001    | 548       | 12

考虑用户,使用上面的表格输入项目ID“406”。将显示一个包含以下信息的表:

        |            |           | qty in      | qty in    |        
 userid | username   | acct_id   | inventory   | vault     | total qty
 ------------------------------------------------------------------------
 5001   | user1      | 400000    | 4           | 0         | 4
5002    | user2      | 400000    | 93          | 29        | 122
5004    | user4      | 400002    | 32          | 0         | 32
5005    | user5      | 400003    | 0           | 43        | 43

我正在使用Codeigniter,所以在我的模型中到目前为止我有这个,我尝试过绝大多数OR或左,右或内连接:

$this->db->select('inventory.userid,inventory.item_id,inventory.amount AS inv_amount,inventory.id,vault_inventory.userid,vault_inventory.item_id,vault_inventory.amount AS vault_amount,vault_inventory.id,players.userid AS userid2,players.acct_id,players.username');
 $this->db->from('players');
 $this->db->join('inventory', "players.userid = inventory.userid", 'left');
 $this->db->join('vault_inventory', "players.userid = vault_inventory.userid");
 $this->db->where('inventory.item_id', $itemID);
 $this->db->or_where('vault_inventory.item_id', $itemID);
 $q_playerList = $this->db->get();
 $return_playerList = $q_playerList->result_array();     

上述查询产生难以解释或说明的随机结果。基本上,似乎数据被复制以在vault_inventory表中为该用户生成随机结果(换句话说,正在搜索inventory.item_id,但它似乎完全忽略了vault_inventory.item_id,而是在那里填充随机的东西这一点尤其明显 当库存表包含一个条目但vault_inventory没有。无论哪种方式,它绝对不正确。

如果我使用:

$this->db->select('inventory.userid,inventory.item_id,inventory.amount AS inv_amount,inventory.id,vault_inventory.userid,vault_inventory.item_id,vault_inventory.amount AS vault_amount,vault_inventory.id,players.userid AS userid2,players.acct_id,players.username');
 $this->db->from('players');
 $this->db->join('inventory', "players.userid = inventory.userid", 'left');
 $this->db->join('vault_inventory', "players.userid = vault_inventory.userid");
 $this->db->where('inventory.item_id', $itemID);
 $this->db->where('vault_inventory.item_id', $itemID);
 $q_playerList = $this->db->get();
 $return_playerList = $q_playerList->result_array();

以上查询不会产生任何结果。

我在视图中生成表格:

<tbody>
    <?php foreach ($playerList as $playerItem): ?>
     <tr>
      <td><?php echo $playerItem['userid']; ?></td>
      <td><?php echo $playerItem['username']; ?></td>
      <td></td>
      <td></td>
      <td><?php echo $playerItem['acct_id']; ?></td>
      <td><?php echo $playerItem['inv_amount']; ?></td>
      <td><?php echo $playerItem['vault_amount']; ?></td>
      <td><?php echo $playerItem['inv_amount'] + $playerItem['vault_amount']; ?></td>
      <td></td>
     </tr>
    <?php endforeach; ?>
 </tbody>

所以基本上我需要一个查询来显示其库存和/或保险库中具有指定ID的玩家列表。如果两个表都不包含任何条目,则将用户从结果中删除。如果其中一个表有一个条目,但另一个没有,则每个用户显示0. 1行,其中一个或两个表中都有一个条目

相应的表永远不会有“0”作为金额 - 如果玩家在该ID的该位置没有任何项目,或者删除/删除它们,则该表中的条目将被删除或永远不存在。

感谢您为我的问题提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

根据wallyk的建议,我进入了MySQL Workbench,用连接来处理一些事情,我想我终于得到了它。

查询最终成为

SELECT `players`.`userid`,`players`.`username`,`players`.`acct_id`,`inventory`.`id` AS `inv_id`,`inventory`.`item_id` AS `inv_item_id`,`inventory`.`amount` AS `inv_amt`,`vault_inventory`.`id` AS `vault_id`,`vault_inventory`.`item_id` AS `vault_item_id`,`vault_inventory`.`amount` AS `vault_amt`
FROM `players`
LEFT JOIN `inventory` ON `inventory`.`userid` = `players`.`userid` AND `inventory`.`item_id` = 601
LEFT JOIN `vault_inventory` ON `vault_inventory`.`userid` = `players`.`userid` AND `vault_inventory`.`item_id` = 601
WHERE `inventory`.`item_id` IS NOT NULL
OR `vault_inventory`.`item_id` IS NOT NULL
ORDER BY `players`.`userid` ASC