MySQL - 使用某个参数

时间:2016-12-24 05:07:56

标签: 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",我希望从VenuesShows表中选择bandid与{{1}相关联的值}}

换句话说,我想选择乐队正在播放的所有节目。为了选择我的数据库中的每个节目,我只使用了showid上的INNER JOIN和{{1 }}

以下是我尝试的内容(使用Venues作为已知的Shows参数):

"1"

我尝试了很多其他的东西,但这是最新的,我没有保存其他的。它似乎在逻辑上有效,但它不允许我使用"bandid"子句中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; 的{​​{1}}。任何帮助将不胜感激!

以下是选择每个节目的查询:

showid

2 个答案:

答案 0 :(得分:0)

我认为你只需要放弃场地。显示&添加shows.venueid。

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 |
+--------+----------+--------+------------+------+---------+---------+-----------+------------+

答案 1 :(得分: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