通过匹配记录查找mysql表

时间:2013-04-11 18:18:59

标签: mysql sql

我有四个表:CouriersCarsPlanesBoats

表Couriers的列有:价格,目的地等等。

最后三个表是不同类型的快递员,其具有与快递员类型相对应的不同列(例如,汽车具有列汽缸)。但是,所有四个表都有列IdCourier,它将快递(及其属性)的类型与其价格,目的地等相关联。

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

我应该使用什么Mysql查询?

这种表结构是否有意义?

2 个答案:

答案 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子句。

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