2016-12-24 4 views
0

私はちょうど悪いデザインか何かを持っているかどうかは分かりませんが、これを理解することに問題があります。ここに私のテーブル..MySQL - 特定のパラメータを使用していくつかのテーブルを選択すると複雑になる

BANDS 
[pk]bandid 
bandname 

SHOWS_BANDS 
[fk]bandid 
[fk]showid 

SHOWS 
[pk]showid 
date 
cost 
ages 

VENUES 
[pk]venueid 
venuename 
street 
city 
state 
zip 
[fk]showid 

バンドは多くのショーを持つことができ、ショーは多くのバンドを持つことができます。会場には多くのショーがあります。

私は何を持っていることは"bandid"であり、それを私がbandidは言い換えればshowid

にリンクされているVenuesShowsテーブルから値を選択したい、私はその番組のすべてを選択します私のデータベースのすべてのシングルショーを選択するために、VenuesShowsINNER JOINを使用しました。ここで

は、私は(知ら"bandid"パラメータとして"1"を使用して)みましたものです:

SELECT (SELECT showid FROM shows_bands WHERE bandid = 1) AS showid, 
shows.date, shows.cost, shows.ages, venues.venuename, venues.street, 
venues.city, venues.state, venues.zip 
FROM shows 
INNER JOIN venues 
ON showid = venues.showid; 

私は他の多くのことを試してみましたが、これは最も最近のものであると私は他のものが保存されていません。論理的にはうまくいくようですが、INNER JOIN ON節の中のASshowidは使用できません。どんな助けもありがとう!ここで

は、一つ一つの番組を選択する問合せです:

SELECT venues.venuename, venues.street, venues.city, venues.state, 
venues.zip, shows.date, shows.cost, shows.ages, shows.showid 
FROM venues 
INNER JOIN shows 
ON venues.showid = shows.showid; 
+0

私は技術的には、私のプログラムのコードでは、私はちょうどショーのすべてを選択することができ、その後、バンディッドに基づいてそれらを除外すると思います。しかし、もし私がただ一つのSQLクエリでそれを行うことができれば、より効率的に思えるでしょう。 – kyrole

+0

テーブル定義で、Venues.showIdを削除してShows.venueIdを追加すべきですか? – gfunk

+0

そのクエリはエラーが発生しているので、私は本当に分かりません。私は出発点として使用したすべてのシングルショーを選択するクエリを追加するために投稿を更新しました。 – kyrole

答えて

0

私はあなただけshows.venueidを追加venues.showid &をドロップする必要があると思います。

mysql> CREATE TABLE bands (bandid INT NOT NULL AUTO_INCREMENT, bandname VARCHAR(36) NOT NULL, PRIMARY KEY (bandid)) ENGINE=InnoDB; 
mysql> CREATE TABLE shows (showid INT NOT NULL AUTO_INCREMENT, date DATE NOT NULL, cost FLOAT UNSIGNED, PRIMARY KEY (showid)) ENGINE=InnoDB; 
mysql> CREATE TABLE venues (venueid INT NOT NULL AUTO_INCREMENT, venuename VARCHAR(36) NOT NULL, addr TEXT,PRIMARY KEY (venueid)) ENGINE=InnoDB; 
mysql> CREATE TABLE shows (showid INT NOT NULL AUTO_INCREMENT, date DATE NOT NULL, cost FLOAT UNSIGNED, venueid INT NOT NULL, PRIMARY KEY (showid)) ENGINE=InnoDB; 

mysql> INSERT INTO venues values (101,"VenueA","Anchorage"),(102,"VenueB","Boston"),(103,"VenueC","Charleston"); 
mysql> INSERT INTO bands values (301,"BandA"), (302,"BandB"), (303,"BandC"); 
mysql> INSERT INTO shows values (201,'2000-01-01',NULL,101), (202, '2000-01-02',NULL,102), (203,'2000-01-03',NULL,103); 
mysql> INSERT INTO show_bands values (301,201), (302,201), (301,202), (303,202), (302,203),(303,203); 


mysql> select * from venues; 
+---------+-----------+------------+ 
| venueid | venuename | addr  | 
+---------+-----------+------------+ 
|  101 | VenueA | Anchorage | 
|  102 | VenueB | Boston  | 
|  103 | VenueC | Charleston | 
+---------+-----------+------------+ 
mysql> select * from bands; 
+--------+----------+ 
| bandid | bandname | 
+--------+----------+ 
| 301 | BandA | 
| 302 | BandB | 
| 303 | BandC | 
+--------+----------+ 
mysql> select * from shows; 
+--------+------------+------+---------+ 
| showid | date  | cost | venueid | 
+--------+------------+------+---------+ 
| 201 | 2000-01-01 | NULL |  101 | 
| 202 | 2000-01-02 | NULL |  102 | 
| 203 | 2000-01-03 | NULL |  103 | 
+--------+------------+------+---------+ 
mysql> select * from show_bands; 
+--------+--------+ 
| bandid | showid | 
+--------+--------+ 
| 301 | 201 | 
| 301 | 202 | 
| 302 | 201 | 
| 302 | 203 | 
| 303 | 202 | 
| 303 | 203 | 
+--------+--------+ 


mysql> SELECT bands.*, shows.*,venues.* FROM bands JOIN show_bands ON bands.bandid=show_bands.bandid LEFT JOIN shows ON show_bands.showid=shows.showid LEFT JOIN venues ON shows.venueid=venues.venueid ORDER BY bands.bandid, shows.date; 
+--------+----------+--------+------------+------+---------+---------+-----------+------------+ 
| bandid | bandname | showid | date  | cost | venueid | venueid | venuename | addr  | 
+--------+----------+--------+------------+------+---------+---------+-----------+------------+ 
| 301 | BandA | 201 | 2000-01-01 | NULL |  101 |  101 | VenueA | Anchorage | 
| 301 | BandA | 202 | 2000-01-02 | NULL |  102 |  102 | VenueB | Boston  | 
| 302 | BandB | 201 | 2000-01-01 | NULL |  101 |  101 | VenueA | Anchorage | 
| 302 | BandB | 203 | 2000-01-03 | NULL |  103 |  103 | VenueC | Charleston | 
| 303 | BandC | 202 | 2000-01-02 | NULL |  102 |  102 | VenueB | Boston  | 
| 303 | BandC | 203 | 2000-01-03 | NULL |  103 |  103 | VenueC | Charleston | 
+--------+----------+--------+------------+------+---------+---------+-----------+------------+ 
+0

ありがとう!私はあなたのソリューションとspencer7593のソリューションを組み合わせて動作させました。私は彼が私の古いデータベース設計で働いていたと思っていますが、解決策としてあなたのものを選んでいます。あなたがvenueidとshowidを交換しておくべきだと思うからです。さもなければ私は会場のテーブルに同じ会場を数回(そのショーごとに)持っています! – kyrole

0
SELECT v.venuename 
     , v.street 
     , v.city 
     , v.state 
     , v.zip 
     , s.date 
     , s.cost 
     , s.ages 
     , s.showid 
    FROM venues v 
    JOIN shows s 
     ON s.showid = v.showid 
    JOIN shows_bands r 
     ON r.showid = s.showid 
    JOIN bands b 
     ON b.bandid = r.bandid 
    WHERE b.bandid = 1 
    ORDER BY s.show_date 
関連する問題