从一个表中检索数据,同时比较另一个表的值

时间:2017-04-24 14:46:27

标签: mysql sql

概述

我有两张桌子,如下所示:

user_planes
----------------------------------
|id |user_id|plane_id|fuel|status|
----------------------------------
| 2     1        1     1   Ready |
----------------------------------

shop_planes
------------------------
|id |name|fuel_capacity|
------------------------
| 1   bob       3      |
------------------------

Foreign Key              Primary Key
user_planes.plane_id <-> shop_planes.id 

我希望能够根据以下条件获取SELECT *以及user_planesname中的每个字段(fuel_capacity):

  • WHERE user_planes.user_id = ? - 将通过PHP添加到查询中的参数。
  • WHERE user_planes.status = 'Ready'
  • WHERE user_planes.fuel < shop_planes.fuel_capacity

问题和我的尝试

我已尝试JOIN但是它会检索不符合该条件的数据,这意味着它会获得来自shop_planes而非user_planes的额外数据。

SELECT * FROM `user_planes` WHERE fuel IN (SELECT shop_planes.fuel_capacity FROM shop_planes WHERE fuel < shop_planes.fuel_capacity) AND user_planes.user_id = 1 AND status = 'Ready'

SELECT * FROM `user_planes` INNER JOIN `shop_planes` ON user_planes.fuel < shop_planes.fuel_capacity AND user_planes.user_id = 1 AND user_planes.status = 'Ready'
  • 我搜索了Stackoverflow并查看了很多问题,但我无法理解。
  • 我查了很多教程,但仍然无法获得理想的结果。

所需的结果是查询应使用user_planes中存储的数据从shop_planes检索数据,同时不会从shop_planes获取任何多余数据。

声明

我真的很难使用JOIN查询,我可以使用多个单独的查询,但我希望优化我的查询,因此我试图将其引入一个查询。

如果他们的问题不明确,请说,我会尽我所能更新。

注意 - 是否可以通过phpmyadmin或其他软件提供简单的查询构建器选项?

提前致谢。

3 个答案:

答案 0 :(得分:1)

你的最后一次尝试并不错,你唯一错过的就是你在帖子开头描述的加入标准。我还将其他过滤器移动到where子句,以更好地区分连接条件和过滤器。

SELECT `user_planes`.*
FROM `user_planes`
INNER JOIN `shop_planes` ON user_planes.plane_id = shop_planes.id 
WHERE user_planes.fuel < shop_planes.fuel_capacity AND user_planes.user_id = 1 AND user_planes.status = 'Ready'

答案 1 :(得分:0)

首先,你需要基础JOIN

  SELECT up.*  -- only user_plane fields
  FROM shop_planes sp  -- CREATE alias for table or field
  JOIN user_planes up
    ON sp.id  = up.plane_id 

案例1:在带有php参数的条件中应用过滤器。

  SELECT up.*
  FROM shop_planes sp
  JOIN user_planes up
    ON sp.id  = up.plane_id 
  WHERE up.user_id = ?

案例2:在带有字符串常量的条件

中应用过滤器
  SELECT up.*
  FROM shop_planes sp
  JOIN user_planes up
    ON sp.id  = up.plane_id 
  WHERE user_planes.status = 'Ready'

案例3:aply过滤器比较两个表中的字段

  SELECT up.*
  FROM shop_planes sp
  JOIN user_planes up
    ON sp.id  = up.plane_id
  WHERE up.fuel < sp.fuel_capacity

答案 2 :(得分:0)

尝试类似:

SELECT 
      up.id AS User_Plane_ID
    , up.[user_id]
    , up.plane_id
    , up.fuel
    , up.[status]
    , sp.name AS shop_Plane_Name
    , sp.fuel_capacity AS shop_Plane_Fuel_Capacity
FROM User_Planes up
INNER JOIN Shop_Planes sp ON up.plane_id = sp.id  
    AND up.fuel < sp.Fuel_Capacity
WHERE up.[status] = 'Ready'
    AND up.[user_id] = ?

绝对找到JOIN的教程,不要使用SELECT *。使用SELECT *,您最终可能会查询比实际需要更多的内容,如果表更改,则可能会导致问题。如果您在查询中明确命名所需的列,那么您将享受更多的一天。

我已将一些列(使用AS)别名,因为其中一些列名可能是保留字。我还移动了JOIN标准,包括燃料过滤器