【问题标题】:Subquery join and total dilemma again子查询连接和总困境再次
【发布时间】:2012-10-26 00:06:06
【问题描述】:

所以这是我最新的 endeaver .. 尝试添加子查询的结果以获取另一个字段或总计...但是总而言之,这个 simple 语法似乎不起作用.. 有人可以请指出正确的方向...提前谢谢

    SELECT 
    sub_events.name AS sub_event, 
    clients.name AS client, 
    divisions.name AS division, 
    subdivisions.name AS subdivision, 
    (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 itinerary_booking_id = 1 AND booking_id = bookings.id AND client_cost IS NOT NULL) AS flight, 
    (SELECT client_cost FROM itineraries WHERE itinerary_type_id = 1 and itinerary_booking_id = 2 AND booking_id = bookings.id AND client_cost IS NOT NULL) AS flight_change, 
    (SELECT client_cost FROM itineraries WHERE itinerary_type_id = 2 AND itinerary_booking_id = 1 AND booking_id = bookings.id AND client_cost IS NOT NULL) AS hotel, 
    (SELECT client_cost FROM itineraries WHERE itinerary_type_id = 2 and itinerary_booking_id = 3 AND booking_id = bookings.id AND client_cost IS NOT NULL) AS hotel_change, 
    (SELECT client_cost FROM itineraries WHERE itinerary_type_id = 3  AND itinerary_booking_id = 1 AND booking_id = bookings.id AND client_cost IS NOT NULL)  AS transfer, 
    (SELECT client_cost FROM itineraries WHERE itinerary_type_id = 3 AND itinerary_booking_id = 4 AND booking_id = bookings.id AND client_cost IS NOT NULL) AS transfer_change
    (SELECT SUM((SELECT client_cost FROM itineraries WHERE itinerary_type_id = 3 AND itinerary_booking_id = 4 AND booking_id = bookings.id AND client_cost IS NOT NULL)
            +(SELECT client_cost FROM itineraries WHERE itinerary_type_id = 1 and itinerary_booking_id = 2 AND booking_id = bookings.id AND client_cost IS NOT NULL)
            +(SELECT client_cost FROM itineraries WHERE itinerary_type_id = 2 AND itinerary_booking_id = 1 AND booking_id = bookings.id AND client_cost IS NOT NULL)
            +(SELECT client_cost FROM itineraries WHERE itinerary_type_id = 2 and itinerary_booking_id = 3 AND booking_id = bookings.id AND client_cost IS NOT NULL)
            +(SELECT client_cost FROM itineraries WHERE itinerary_type_id = 3  AND itinerary_booking_id = 1 AND booking_id = bookings.id AND client_cost IS NOT NULL)
            +(SELECT client_cost FROM itineraries WHERE itinerary_type_id = 3 AND itinerary_booking_id = 4 AND booking_id = bookings.id AND client_cost IS NOT NULL)) AS Total)
FROM 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 
GROUP BY bookings.id`

【问题讨论】:

  • 什么具体不起作用?
  • 我无法得到子查询的总和...
  • 使用 SUM 和 GROUP BY 时,需要在 GROUP BY 子句中列出所有未聚合的列。 MySQL 为 GROUP BY 提供了一个非标准扩展,称为隐藏列。但是真的很难用。在尝试调试查询之前,请阅读并理解此网页 dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html
  • 这是一个可怕的查询,由于大量相关的子查询,它的执行就像垃圾一样。您可以通过简单地加入itineraries 和一些ifcase 语句来实现所有这些。

标签: mysql join sum


【解决方案1】:

你不想要SUM(),你只想添加它们:

... AS transfer_change,
(SELECT client_cost FROM itineraries ...) +
(SELECT client_cost FROM itineraries ...) +
... +
(SELECT client_cost FROM itineraries ...) AS Total


然而,这是一个可怕的查询,并且由于大量相关的子查询而表现得像废话。您可以通过简单地加入行程和基于ifcase 语句的一些sum() 值来实现所有这些。

【讨论】:

  • 我同意.. 它真的很糟糕.. 任何人都可以想出更好的版本吗?真的很有帮助....谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2017-10-11
  • 2010-11-06
  • 2020-09-27
  • 2021-05-13
相关资源
最近更新 更多