我正在尝试创建一个查询,其中我加入USER
表和ADDRESS_BOOK
表,其中1个用户可能有多个地址(即结算,发货)。每个地址都是ADDRESS_BOOK
表中的自己的条目。
ADDRESS_BOOK
表中的每个条目都有一个USER_ID
值,对应USER
表中的一个条目。
我想得到以下结果:
____________________________
USER ID | BILLING | SHIPPING
现在我每USER_ID
收到两个结果,一个用于SHIPPING
地址,另一个用于BILLING
地址。我需要在每个USER_ID
获得一个结果,其中SHIPPING
和BILLING
信息(两个查询结果)被展平。
答案 0 :(得分:4)
使用GROUP BY
按用户ID对行进行分组,然后使用GROUP_CONCAT
将所有条目作为单行进行分组。使用以下示例(我使用fullname
而不是用户ID只是为了让它更容易看到):
CREATE TABLE user (
user_id INT AUTO_INCREMENT PRIMARY KEY,
fullname VARCHAR(32)
);
CREATE TABLE billing (
user_id INT,
billing VARCHAR(128)
);
CREATE TABLE shipping (
user_id INT,
shipping VARCHAR(128)
);
INSERT INTO user(fullname) VALUES ('Susan');
SET @last_id = LAST_INSERT_ID();
INSERT INTO billing VALUES
(@last_id, 'Box 123');
INSERT INTO shipping VALUES
(@last_id, '123 Oak Street'),
(@last_id, '234 Pine Street');
INSERT INTO user(fullname) VALUES ('Mike');
SET @last_id = LAST_INSERT_ID();
INSERT INTO billing VALUES
(@last_id, 'Box 12'),
(@last_id, 'Deep Mine 3');
INSERT INTO shipping VALUES
(@last_id, '4711 Iron Road');
此选择语句
SELECT fullname
, group_concat(shipping)
, group_concat(billing)
FROM user JOIN billing USING (user_id)
JOIN shipping USING (user_id)
GROUP BY fullname;
会给出这个结果:
+----------+--------------------------------+--------------------+
| fullname | Shipping | Billing |
+----------+--------------------------------+--------------------+
| Mike | 4711 Iron Road,4711 Iron Road | Box 12,Deep Mine 3 |
| Susan | 234 Pine Street,123 Oak Street | Box 123,Box 123 |
+----------+--------------------------------+--------------------+
2 rows in set (0.00 sec)
答案 1 :(得分:3)
这可能会有所帮助:
SELECT U.USER_ID,
(SELECT ADDRESS FROM ADDRESS_BOOK WHERE USER_ID = U.USER_ID AND ADDRESS_TYPE = 'BILLING') AS BILLING,
(SELECT ADDRESS FROM ADDRESS_BOOK WHERE USER_ID = U.USER_ID AND ADDRESS_TYPE = 'SHIPPING') AS SHIPPING
FROM USER U;