您好,每个人都对所有这些数据库东西不熟悉,他们不停地尝试使一个测试数据库可用于一个大学项目。
我有一个名为customers和caravans的表,另一个名为customers_caravans的表将两者联系在一起。
然后我有一张决赛桌,叫做以前的作品。这详细说明了customer_caravanID的先前工作。
但是,似乎无法计算出where语句来仅提取特定客户先前工作的数据。
似乎遍历整个客户列表????
对于某人来说,这很容易解决,因为我的select命令错误或可能只是数据库的整个设计。
无论如何这里数据库...
describe customers;
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| customerID | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(256) | NO | | NULL | |
| street_address | varchar(256) | YES | | NULL | |
| postcode | varchar(256) | YES | | NULL | |
| telephone | varchar(256) | YES | | NULL | |
+----------------+--------------+------+-----+---------+----------------+
describe caravans;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| caravanID | int(11) | NO | PRI | NULL | auto_increment |
| make | varchar(256) | NO | | NULL | |
| model | varchar(256) | NO | | NULL | |
| vin_number | varchar(256) | YES | | NULL | |
| axle_number | tinyint(4) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
describe customers_caravans;
+----------------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+---------+------+-----+---------+----------------+
| customers_caravansID | int(11) | NO | PRI | NULL | auto_increment |
| customerID | int(11) | NO | MUL | NULL | |
| caravanID | int(11) | NO | MUL | NULL | |
+----------------------+---------+------+-----+---------+----------------+
describe previous_works;
+----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+---------------+------+-----+---------+-------+
| customers_caravansID | int(11) | NO | MUL | NULL | |
| work | varchar(256) | YES | | NULL | |
| partID | int(11) | YES | MUL | NULL | |
| date | date | YES | | NULL | |
| cost | decimal(13,2) | YES | | NULL | |
+----------------------+---------------+------+-----+---------+-------+
其中包含以下数据...
INSERT INTO customers (name,street_address,postcode,telephone) VALUES
('Megan Rose Hoobar', '41-43 Barrows Street', 'IP14 6HJ', '01449 77777'),
('Tim
Smith', '17 Wynton Rise', 'JF77 2AB', '01564 673742');
INSERT INTO caravans (make,model,vin_number,axle_number) VALUES
('Elddis','Buccaneer Commodore','1HGBH41JXMN1091866','2'),
('Lunar','Venus 590/6','1HGBH41JXMN1091111','1');
INSERT INTO customers_caravans (customerID,caravanID) VALUES ('1','1'), ('2','2');
INSERT INTO previous_works (customers_caravansID,work,partID,date,cost)
VALUES
('1','Service','3','2015-04-15','150'),
('1','Service','3','2016-04-15','150'),
('1','Service','5','2017-04-15','180'),
('2','Solar Panel Fitting','1','2018-02-18','380');
在此选择中,我只想获取customers_caravansID匹配1的客户的数据,即在这种情况下,只有我让两个客户重复的服务...
select x.name
, y.make
, y.model
, p.work
from caravans y
, customers x
, customers_caravans xy
,previous_works p
where p.customers_caravansID = "1";
+----------------------+--------+---------------------+---------+
| name | make | model | work |
+----------------------+--------+---------------------+---------+
| Megan Rose Hoobar | Elddis | Buccaneer Commodore | Service |
| Megan Rose Hoobar | Elddis | Buccaneer Commodore | Service |
| Megan Rose Hoobar | Elddis | Buccaneer Commodore | Service |
| Megan Rose Hoobar | Elddis | Buccaneer Commodore | Service |
| Megan Rose Hoobar | Elddis | Buccaneer Commodore | Service |
| Megan Rose Hoobar | Elddis | Buccaneer Commodore | Service |
| Megan Rose Hoobar | Lunar | Venus 590/6 | Service |
| Megan Rose Hoobar | Lunar | Venus 590/6 | Service |
| Megan Rose Hoobar | Lunar | Venus 590/6 | Service |
| Megan Rose Hoobar | Lunar | Venus 590/6 | Service |
| Megan Rose Hoobar | Lunar | Venus 590/6 | Service |
| Megan Rose Hoobar | Lunar | Venus 590/6 | Service |
| Tim Smith | Elddis | Buccaneer Commodore | Service |
| Tim Smith | Elddis | Buccaneer Commodore | Service |
| Tim Smith | Elddis | Buccaneer Commodore | Service |
| Tim Smith | Elddis | Buccaneer Commodore | Service |
| Tim Smith | Elddis | Buccaneer Commodore | Service |
| Tim Smith | Elddis | Buccaneer Commodore | Service |
| Tim Smith | Lunar | Venus 590/6 | Service |
| Tim Smith | Lunar | Venus 590/6 | Service |
| Tim Smith | Lunar | Venus 590/6 | Service |
| Tim Smith | Lunar | Venus 590/6 | Service |
| Tim Smith | Lunar | Venus 590/6 | Service |
| Tim Smith | Lunar | Venus 590/6 | Service |
+----------------------+--------+---------------------+---------+
答案 0 :(得分:0)
这是您使用连接多个表的最新形式的查询。注意它如何关联每个表。
SELECT
b.name,
a.make,
a.model,
d.work
FROM caravans a
JOIN customers_caravans c
ON a.caravamID = c.caravanID
JOIN customers b
ON a.customerID = b.customerID
JOIN previous_works d
ON c.customers_caravansID = d.customers_caravansID
WHERE d.customers_caravansID = "1";