2

CouriersCarsPlanesおよびの4 つのテーブルがありBoatsます。

Couriers テーブルには、価格、宛先などの列があります。

最後の 3 つのテーブルは、クーリエのタイプに適した異なる列を持つクーリエの異なるタイプです (たとえば、車には列のシリンダーがあります)。ただし、4 つのテーブルすべてに列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 = ?;

しかし、これはかなり高価です。代わりに、フィールドIdCourierIdType、およびTypeを持つ CouriersTypes のような名前の 5 番目のテーブルを個人的に作成します。高速検索のため にIdCourierにインデックスを付けます。この例では、Courier が任意またはすべてのタイプ (車、飛行機、ボート) に適合できると想定しています。 クエリは次のようになります。

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

大量のデータの場合、結果ははるかに高速になります。 クーリエが 1 つのタイプしか実行できない場合は、その例を忘れて、idType と Type を 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 = ?

構文を書きやすくするために、いつでもテーブルに別名を付けることができます。また、WHERE 句は、特定のレコードを選択する場合にのみ使用されます。

create table ステートメントを投稿できれば、役に立ちます。

于 2013-04-11T18:40:39.713 に答える