概述
我有两张桌子,如下所示:
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_planes
和name
中的每个字段(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'
所需的结果是查询应使用user_planes
中存储的数据从shop_planes
检索数据,同时不会从shop_planes
获取任何多余数据。
声明
我真的很难使用JOIN
查询,我可以使用多个单独的查询,但我希望优化我的查询,因此我试图将其引入一个查询。
如果他们的问题不明确,请说,我会尽我所能更新。
注意 - 是否可以通过phpmyadmin或其他软件提供简单的查询构建器选项?
提前致谢。
答案 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标准,包括燃料过滤器