我不确定我的设计是不是很糟糕,但是我无法解决这个问题。这是我的桌子..
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"
,我希望从Venues
和Shows
表中选择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
答案 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