2

私は3つのテーブルcars、drivers、cars_driversを持っています。

私の車のテーブルには2つのフィールドがあります - carid と car_model

私のドライバーテーブルには2つのフィールドがあります - driverid と driver_name

my cars_drivers には、主キーである carid と driverid の 2 つのフィールドがあります。

車のテーブルに 3 つのエントリがあります

  1. トヨタ
  2. ホンダ
  3. 起亜

そして私のドライバーテーブルには

  1. ボブ
  2. トム

car_drivers テーブルはどのようになりますか? carId に 3 以下、DriverId に 2 以下の数字を入れますか?

1-1
1-2
1-3

ランダムなドライバーで 3 つの車のモデルを表示するクエリを作成するにはどうすればよいですか?

私は次のようなものを探しています

toyota  bob
kia     tom
honda   bob

私はいくつかのチュートリアルを見てきましたが、結合がどのように機能するかについても理解していません

4

3 に答える 3

2

JOIN は情報を関連付けます。car_driver のエントリは、車がドライバーによって運転されていることを示しています。ランダムなドライバーを表示したいだけの場合、結合はまったく必要ありません。すべてのドライバーを取得して、リストからランダムに 1 つを選択するだけです。

ただし、通常、データベースは情報を関連付けます。たとえば、彼らが持っていた仕事を持つ人。ランダムなジョブを誰かの隣に置くことはできません。JOIN を使用して正しい関係を取得します。

何かのようなもの

  SELECT * FROM jobs
     LEFT JOIN people_jobs ON jobs.jobid = people_jobs.jobid 
     LEFT JOIN people ON people.personid = people_jobs.personid 
     WHERE person.personname = 'Bob Smith' 

ボブが持っていたすべての仕事に関する情報を取得します。

一方

  SELECT * FROM people 
     LEFT JOIN people_jobs ON people.personid = people_jobs.personid 
     LEFT JOIN jobs ON jobs.jobid = people_jobs.jobid 
     WHERE jobs.job = 'Waiter ' 

ウェイターであったデータベース内のすべての人を取得します。

于 2012-10-20T01:07:14.040 に答える
2

スキーマはcars_drivers、複合主キーを形成する 2 つの列 (フィールド) がテーブルにあり、個別にcarsおよびdriversテーブルの外部キーとなるようにする必要があります。

テーブルには、cars_drivers各ドライバーがどの車を「運転できる」、「運転する」、または「運転したい」かが記録されています。

指定されたデータの場合、carid列の値は 1 ~ 3 の範囲である必要があります。列の値はdriverid1 ~ 2 の範囲である必要があります。InnoDB ストレージを使用していると仮定すると、これらの制約は自動的に適用されます (MyISAM については判断を留保しますが、PK-FK 制約は適用されないと思います)。

CREATE TABLE cars_drivers
(
    carid      INTEGER NOT NULL REFERENCES cars,
    driverid   INTEGER NOT NULL REFERENCES drivers,
    PRIMARY KEY(carid, driverid)
);  -- Plus storage options as required ...

次の 3 つのテーブルから選択します。

SELECT c.*, d.*
  FROM cars AS c
  JOIN cars_drivers AS j ON c.carid = j.carid
  JOIN drivers AS d ON d.driverid = j.driverid;

必要に応じて結合に条件を適用できます。cars_drivers値は他の 2 つのテーブルのそれぞれの値の 1 つと同じであるため、この結合のデータを表示しても特に利点はありません。

モデル名とドライバー名だけを取得するには、それらの列だけを指定します。

SELECT c.car_model, d.driver_name
  FROM cars AS c
  JOIN cars_drivers AS j ON c.carid = j.carid
  JOIN drivers AS d ON d.driverid = j.driverid;
于 2012-10-20T01:09:36.647 に答える
1

テーブルが次のようになっているとします。

Table 1: Drivers
    id      Name
    1       Joe Bloggs
    2       Si Borg
    3       Anne Droyd

Table 2: Cars
    id      Type
    9       Honda
    8       Toyota
    7       Kia


Table 3: CarDrivers
    CarId   DriverId
    9       1
    9       2
    8       2
    7       3

クエリは次のようになります。

select d.name, c.type
from Drivers d
inner join CarDrivers cd
    on d.id = cd.DriverId
inner join Cars c
    on cd.CarId = c.id

結果を与える:

Name        Type
Joe Bloggs  Honda
Si Borg     Honda
Si Borg     Toyota
Anne Droyd  Kia

CarDriver テーブルは基本的に、ドライバーとそのドライバーが運転する車をリンクしています。つまり、そのテーブルの最初の行は、ID 1 のドライバーが ID 9 の車を運転していることを示しています。

于 2012-10-20T01:07:03.247 に答える