2

我有四个表:CouriersCars和。PlanesBoats

Couriers 表有如下列:价格、目的地等。

最后三个表是不同类型的快递员,具有适合快递员类型的不同列(例如,汽车有圆柱柱)。但是,所有四个表都有列IdCourier,它将快递的类型(及其属性)与其价格、目的地等联系起来。

我知道IdCourier快递员,想知道它的价格,想知道它是汽车、飞机还是船。

我应该使用什么 Mysql 查询?

这种表结构有意义吗?

4

2 回答 2

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 的第五个表,其中包含IdCourierIdTypeType字段。索引IdCourier以进行快速搜索。 此示例假定 Courier 可以适合任何或所有类型(汽车、飞机、船)。 现在您的查询变为:

SELECT `price`, `Type` 
FROM Couriers
JOIN CouriersTypes ON (Couriers.Id = CouriersTypes.IdCourier)
WHERE IdCourier = ?;

对于大量数据,您的结果会快得多。 如果一个 courier 只能做一种类型,那么忘记那个例子,只需将idTypeType添加到 Couriers表中并直接查询即可。

SELECT `price`, `Type` 
FROM Couriers
WHERE Id = ?;

希望这可以帮助。

于 2013-04-11T19:53:27.187 回答
0

结构是有道理的。查询的类型取决于您计划对数据执行的操作。

如果您想从 Cars 中检索特定的汽车,您可以使用以下内容:

SELECT * FROM Courier INNER JOIN Cars ON Cars.IdCourier = Courier.IdCourier WHERE Courier.IdCourier = ?

您总是可以给表起别名,以使语法更容易编写。此外,仅当您想要 SELECT 特定记录时才使用 WHERE 子句。

如果您可以发布创建表语句,它将有所帮助。

于 2013-04-11T18:40:39.713 回答