我有 4 个表,我正在尝试在其中提取某些数据,这个查询的结构可能不是很好,但我的原型(prototype)至少需要一些东西。我得到了
users ------ id parent_id name surname bookings -------- id client_id division_id subdivision_id sub_event_id host_id guest_id itineraries ---------- id booking_id itinerary_type_id client_cost itinerary_type ------------- flight hotel transfer
这是我当前的查询
SELECT (SELECT CONCAT(name,' ',surname) FROM users WHERE id = bookings.host_id) AS host, CONCAT(users.name,' ',users.surname) AS name, (SELECT client_cost FROM itineraries WHERE itinerary_type_id = 1 AND booking_id = bookings.id AND client_cost IS NOT NULL) AS flight, (SELECT client_cost FROM itineraries WHERE itinerary_type_id = 2 AND booking_id = bookings.id AND client_cost IS NOT NULL) AS hotel, (SELECT client_cost FROM itineraries WHERE itinerary_type_id = 3 AND booking_id = bookings.id AND client_cost IS NOT NULL) AS transfer, (total1 + total2 + total3) AS total FROM (SELECT(SELECT client_cost FROM itineraries WHERE itinerary_type_id = 1 AND booking_id = bookings.id AND client_cost IS NOT NULL) as total1, (SELECT client_cost FROM itineraries WHERE itinerary_type_id = 2 AND booking_id = bookings.id AND client_cost IS NOT NULL) as total2, (SELECT client_cost FROM itineraries WHERE itinerary_type_id = 3 AND booking_id = bookings.id AND client_cost IS NOT NULL) as total3 FROM bookings) q, users JOIN bookings ON bookings.guest_id = users.id JOIN clients ON users.client_id = bookings.client_id JOIN details ON details.user_id = users.id JOIN divisions ON divisions.client_id = users.client_id JOIN subdivisions ON subdivisions.division_id = bookings.division_id JOIN sub_events ON sub_events.id = bookings.sub_event_id JOIN itineraries ON itineraries.booking_id = bookings.id WHERE bookings.id = 1572 GROUP BY bookings.id
预期结果是
host |name |flight|hotel|transfer|Total -------------------------------------------------- Mike Little|Bob Parker|200 |100 |30 |330
目前,我正在使用子查询临时制作一个表格,从中我可以获得总数。但它似乎不起作用...我认为,问题是我无法将预订 ID 传递给新的临时子查询表...还有其他方法可以解决它吗?我将永远幸福! :-) ..真的!!!
最佳答案
这可能不是您正在寻找的确切 SQL(省略了许多与其他代码表的联接,但仅包括主要查询),并且可能存在愚蠢的语法错误,因为我尚未对其进行测试。但想法是选择预订摘要,然后将摘要与用户表连接起来。 (该查询被通用化以适应多个预订 ID 选择。)
SELECT
booking_summary.booking_id,
booking_summary.host_id,
concat(users.name, ' ', users.surname) as host,
concat(users.name, ' ', users.surname) as name,
booking_summary.flight,
booking_summary.hotel,
booking_summary.transfer,
(booking_summary.flight+booking_summary.hotel+booking_summary.transfer) as total
FROM
(select booking_id, max(host_id) as host_id, sum(flight) as flight, sum(hotel) as hotel, sum(transfer) as transfer from (
select b.host_id, i.booking_id, i.client_cost as flight, 0 as hotel, 0 as transfer from itineraries i, bookings b where i.itinerary_type_id = 1 AND i.booking_id in (1572, 1573, 1574) and i.booking_id=b.id
union all
select b.host_id, i.booking_id, 0 as flight, i.client_cost as hotel, 0 as transfer from itineraries i, bookings b where i.itinerary_type_id = 2 AND i.booking_id in (1572, 1573, 1574) and i.booking_id=b.id
union all
select b.host_id, i.booking_id, 0 as flight, 0 as hotel, i.client_cost as transfer from itineraries i, bookings b where i.itinerary_type_id = 3 AND i.booking_id in (1572, 1573, 1574) and i.booking_id=b.id
) temp_booking_result group by booking_id) booking_summary,
users
WHERE
users.id=booking_summary.host_id;
关于Mysql连接查询困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13061288/