【发布时间】:2021-07-09 21:15:09
【问题描述】:
SQL 不是我的专长。我有一个可以完成我需要它的工作查询,但我知道必须有一种更清洁的方式来实现我的目标。
查询应该返回:
- Name
- Date of most recent donation (if any)
- Political Party guess as: R, D, or U, where:
- R = Likely Republican (more republican donations than other donations)
- D = Likely Democrat (more democrat donations than other donations)
- U = Undtermined (no donations on record, or R and D are tied for first place.
- Address
这是一个 SQLFiddle 链接,您可以在其中找到表和我的解决方案:http://sqlfiddle.com/#!9/f2303f/2。或者,这里是架构构建:
CREATE TABLE People (
ID INT UNSIGNED DEFAULT '0000' NOT NULL,
Name CHAR(20) DEFAULT '' NOT NULL,
Address CHAR(40) DEFAULT '' NOT NULL,
PRIMARY KEY(ID));
INSERT INTO People VALUES
(1, "Name1", "Idaho"),
(2, "Name2","UCLA"),
(3, "Name3", "Carolina"),
(4, "Name4", "Portland");
CREATE TABLE Donations (
ID INT UNSIGNED DEFAULT '0000' NOT NULL,
People_ID INT UNSIGNED DEFAULT '0000' NOT NULL,
Donation_Date DATE NOT NULL,
Party INT SIGNED DEFAULT '0000' NOT NULL,
PRIMARY KEY(ID));
INSERT INTO Donations VALUES
#Name1
(1, 1, "2000-06-23", 1), (2, 1, "2000-06-24",-1),
#Name2
(3, 2, "2001-06-25", 1),(4, 2, "2001-06-26", 1),
# Name3
(5, 3, "2002-06-26", -1),(6, 3, "2002-06-27", -1);
#Name4
#None
这里是查询:
SELECT Name,
IFNULL(donation_date, 'None') as 'Recent Donation',
IFNULL(voting_guess, "U") as 'Party Guess',
Address
FROM people p
LEFT JOIN donations on donations.people_id = p.id AND donations.donation_date = (
SELECT MAX(donation_date)
FROM donations
WHERE donations.people_id = p.id)
LEFT JOIN
(SELECT people_id,
(CASE
WHEN SUM(party) > 0 THEN "R"
WHEN SUM(party) < 0 THEN "D"
END
) AS voting_guess
FROM donations
GROUP BY people_id
) voting ON P.id = voting.people_id
具体来说,我想尝试将后两个左连接浓缩为一个。有什么建议吗?
【问题讨论】:
-
请解释查询应该做什么。
-
@GordonLinoff 公平点。添加到帖子顶部。
标签: mysql sql database join select