我有四个表:Couriers
,Cars
,Planes
和Boats
。
表Couriers的列有:价格,目的地等等。
最后三个表是不同类型的快递员,其具有与快递员类型相对应的不同列(例如,汽车具有列汽缸)。但是,所有四个表都有列IdCourier
,它将快递(及其属性)的类型与其价格,目的地等相关联。
我知道快递员的IdCourier
并想知道它的价格并知道它是汽车,飞机还是船只。
我应该使用什么Mysql查询?
这种表结构是否有意义?
答案 0 :(得分:1)
有很多方法可以做到这一点。如果您保留了该表结构,那么您可以将其保持为1个查询:
SELECT `price`, 'car' as `mytype`
FROM Couriers
JOIN Cars ON (Couriers.Id = Cars.IdCourier)
WHERE Cars.IdCourier = ?
UNION
SELECT `price`, 'plane' as `mytype`
FROM Couriers
JOIN Planes ON (Couriers.Id = Planes.IdCourier)
WHERE Planes.IdCourier = ?
UNION
SELECT `price`, 'boat' as `mytype`
FROM Couriers
JOIN Boats ON (Couriers.Id = Boats.IdCourier)
WHERE Boats.IdCourier = ?;
但这相当昂贵。相反,我个人会创建一个名为CouriersTypes的第5个表,其中包含 IdCourier , IdType 和类型字段。索引 IdCourier 以进行快速搜索。 此示例假定Courier可以适合任何或所有类型(汽车,飞机,船)。现在您的查询变为:
SELECT `price`, `Type`
FROM Couriers
JOIN CouriersTypes ON (Couriers.Id = CouriersTypes.IdCourier)
WHERE IdCourier = ?;
对于大量数据,您的结果会快得多。 IF 快递只能执行一种类型,然后忘记该示例,只需将 idType 和类型添加到Couriers表中,然后直接查询。
SELECT `price`, `Type`
FROM Couriers
WHERE Id = ?;
希望这有帮助。
答案 1 :(得分:0)
结构很有意义。查询类型取决于您计划对数据执行的操作。
如果您想从汽车中检索特定汽车,您可以使用以下内容:
SELECT * FROM Courier INNER JOIN Cars ON Cars.IdCourier = Courier.IdCourier WHERE Courier.IdCourier = ?
您总是可以对表进行别名以使语法更容易编写。此外,只有在您想要选择特定记录时才会使用WHERE子句。
如果您可以发布创建表语句,那将有所帮助。