我的核心案例有點復雜,所以我會用一個例子來說明它。讓我們假設我有這樣的表:
動物
| 名稱(PK) | 顏色 |
|---|---|
| 貓1 | 白色的 |
| 貓2 | 紅色的 |
| 狗1 | 黑色的 |
地方
| 地方(PK) | 姓名 (FK) | 數量 |
|---|---|---|
| 籠1 | 貓1 | 2 |
| 房間 1 | 貓1 | 3 |
| 籠2 | 狗1 | 5 |
售中
| 姓名 (FK) | 數量 | 價錢 |
|---|---|---|
| 貓1 | 1 | 50.00 |
| 狗1 | 3 | 600.00 |
| 貓2 | 2 | 1.00 |
這是創建它們的代碼:
CREATE TABLE `animals` (
`name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`color` varchar(100) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `in_sale` (
`name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`amount` int(11) NOT NULL,
`price` varchar(100) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `places` (
`place` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`amount` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `animals` (`name`, `color`) VALUES
('cat1', 'white'),
('cat2', 'red'),
('dog1', 'black');
INSERT INTO `in_sale` (`name`, `amount`, `price`) VALUES
('cat1', 1, '25.00'),
('cat1', 1, '50.00'),
('cat2', 2, '1.00'),
('dog1', 3, '600.00');
INSERT INTO `places` (`place`, `name`, `amount`) VALUES
('cage1', 'cat1', 2),
('cage2', 'dog1', 5),
('room1', 'cat1', 3);
現在我想運行一個查詢:
SELECT a.*, p.place, p.amount AS amount_in_place, s.sales
FROM animals AS a
LEFT JOIN places AS p ON a.name=p.name
LEFT JOIN (SELECT GROUP_CONCAT("Amount: ",amount, " and price: ",price separator ", ") AS sales, name FROM in_sale GROUP BY name) AS s ON s.name=a.name
ORDER BY a.name;
但不幸的是,我意識到結果并不是我所期望的。
結果:
| 姓名 | 顏色 | 地方 | 金額就地 | 銷售量 |
|---|---|---|---|---|
| 貓1 | 白色的 | 籠1 | 2 | 數量:1,價格:25.00,數量:1,價格:5... |
| 貓1 | 白色的 | 房間 1 | 3 | 數量:1,價格:25.00,數量:1,價格:50.00 |
| 貓2 | 紅色的 | 空值 | 空值 | 數量:2 價格:1.00 |
| 狗1 | 黑色的 | 籠2 | 5 | 數量:3 價格:600.00 |
預期的:
| 姓名 | 顏色 | 地方 | 金額就地 | 銷售量 |
|---|---|---|---|---|
| 貓1 | 白色的 | 籠1 | 2 | 數量:1,價格:25.00,數量:1,價格:50.00 |
| 貓1 | 白色的 | 房間 1 | 3 | 空值 |
| 貓2 | 紅色的 | 空值 | 空值 | 數量:2 價格:1.00 |
| 狗1 | 黑色的 | 籠2 | 5 | 數量:3 價格:600.00 |
What can I change in my query to join the last table with just first matching row? I tried to manipulate a little bit with LIMIT 1,OUTER JOIN and MIN as I found some suggestions in similar questions, but I couldn't achieve my goal anyway.
IMPORTANT! Pay attention that animals can be in sale, even if they're have no place assigned.
uj5u.com熱心網友回復:
感謝@Akina,我可以為我的示例提供最終版本的代碼:
SELECT name,
animals.color,
places.place,
places.amount amount_in_place,
CASE WHEN name = LAG(name) OVER (PARTITION BY name ORDER BY place)
THEN
null
ELSE
(SELECT GROUP_CONCAT("Amount: ",amount, " and price: ",price
SEPARATOR ", ") AS sales
FROM in_sale
WHERE in_sale.name=animals.name GROUP BY name)
END sales
FROM animals
LEFT JOIN places USING (name)
LEFT JOIN in_sale USING (name)
GROUP BY 1,2,3,4;
請注意,它僅適用于MySQL 8 或更高版本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/346615.html
上一篇:MYSQL左連接缺少行
