我有四个表:Couriers
、Cars
和。Planes
Boats
Couriers 表有如下列:价格、目的地等。
最后三个表是不同类型的快递员,具有适合快递员类型的不同列(例如,汽车有圆柱柱)。但是,所有四个表都有列IdCourier
,它将快递的类型(及其属性)与其价格、目的地等联系起来。
我知道IdCourier
快递员,想知道它的价格,想知道它是汽车、飞机还是船。
我应该使用什么 Mysql 查询?
这种表结构有意义吗?
有很多方法可以做到这一点。如果您保留该表结构,则可以将其保留为 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 的第五个表,其中包含IdCourier、IdType和Type字段。索引IdCourier以进行快速搜索。 此示例假定 Courier 可以适合任何或所有类型(汽车、飞机、船)。 现在您的查询变为:
SELECT `price`, `Type`
FROM Couriers
JOIN CouriersTypes ON (Couriers.Id = CouriersTypes.IdCourier)
WHERE IdCourier = ?;
对于大量数据,您的结果会快得多。 如果一个 courier 只能做一种类型,那么忘记那个例子,只需将idType和Type添加到 Couriers表中并直接查询即可。
SELECT `price`, `Type`
FROM Couriers
WHERE Id = ?;
希望这可以帮助。
结构是有道理的。查询的类型取决于您计划对数据执行的操作。
如果您想从 Cars 中检索特定的汽车,您可以使用以下内容:
SELECT * FROM Courier INNER JOIN Cars ON Cars.IdCourier = Courier.IdCourier WHERE Courier.IdCourier = ?
您总是可以给表起别名,以使语法更容易编写。此外,仅当您想要 SELECT 特定记录时才使用 WHERE 子句。
如果您可以发布创建表语句,它将有所帮助。