我有 4 个表:booking、address、search_address 和 search_address_log
表:(相关列)
预订:(pickup_address_id, dropoff_address_id)
地址:(address_id,邮政编码)
search_address: (address_id, postcode)
search_address_log: (id, from_id, to_id)
我需要做的是从 booking 和 search_address_log 中获得一个计数 按接送和从/到邮政编码分组。
我可以为每个单独执行此操作,即:
预订:
SELECT
a1.postcode b_From,
a2.postcode b_to,
COUNT(*) b_count
FROM booking b
INNER JOIN address a1 ON b.pickup_address_id = a1.address_id
INNER JOIN address a2 ON b.destination_address_id = a2.address_id
GROUP BY b_From, b_To
ORDER BY COUNT(*) DESC
LIMIT 10
搜索地址日志:
SELECT
sa1.postcode s_From,
sa2.postcode s_To,
COUNT(*) s_count
FROM search_address_log sal
INNER JOIN search_address sa1 ON sal.from_id=sa1.address_id
INNER JOIN search_address sa2 ON sal.to_id=sa2.address_id
GROUP BY s_From, s_To
ORDER BY COUNT(*) DESC
LIMIT 10
返回表如下:
| b_To b_From b_count || s_To s_From s_count |
| x y 10 || x y 50 |
| a b 5 || a b 60 |
我需要什么:
| To From b_count s_count |
| x y 10 50 |
| a b 5 60 |
谢谢,
乔治
最佳答案
从技术上讲,您需要的是全外连接
,但 MySQL 不支持。然而,下面应该做你想做的——获取两列的每个 from
和 to
值的摘要:
SELECT b_from, b_to, sum(b_count) as b_count, sum(s_count) as s_count
FROM ((SELECT a1.postcode as b_From, a2.postcode as b_to, COUNT(*) as b_count, 0 as s_count
FROM booking b INNER JOIN
address a1
ON b.pickup_address_id = a1.address_id INNER JOIN
address a2
ON b.destination_address_id = a2.address_id
GROUP BY b_From, b_To
) UNION ALL
(SELECT sa1.postcode as s_From, sa2.postcode as s_To, 0, COUNT(*) as s_count
FROM search_address_log sal INNER JOIN
search_address sa1
ON sal.from_id = sa1.address_id INNER JOIN
search_address sa2
ON sal.to_id = sa2.address_id
GROUP BY b_From, b_To
)
) ft
GROUP BY s_From, s_to;
关于mysql - 复杂连接(Joining Joins),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27432050/