简体   繁体   English

如何将 GROUP BY 应用于 MySQL 中的多个 SELECT 语句

[英]How to apply GROUP BY to multiple SELECT statements in MySQL

I creating multipal select query that selects data from multiple tables.我创建了从多个表中选择数据的多重 select 查询。 I have completed all the query but now I have to apply the GROUP BY to the SECOND select query but getting error is Subquery returns more than 1 row.我已经完成了所有查询,但现在我必须将 GROUP BY 应用于 SECOND select 查询,但出现错误是子查询返回超过 1 行。

GROUP BY in not working on suquery getting error is Subquery returns more than 1 row. GROUP BY 在不处理 suquery 得到错误是子查询返回超过 1 行。

I am using the below query:我正在使用以下查询:

  SELECT 

  ( SELECT COUNT(bookings.user_id) as cleanings
    FROM users INNER JOIN bookings
    ON bookings.user_id = users.id 
    WHERE users.is_provider = 1 
    AND bookings.booking_status_id = 4 GROUP BY user.id) AS cleanings,

  users.first_name,
  users.last_name,
  providerservicemaps.amount,
  TRUNCATE(SUM(userreviews.rating)*5/(COUNT(userreviews.user_review_by)*5), 
  1) AS rating,
  users.profilepic,
  postcodes.postcode,
  postcodes.suburb,
  servicecategories.name,
  provider_working_hours.start_time,
  provider_working_hours.end_time
FROM users 
  INNER JOIN provider_working_hours
    ON provider_working_hours.provider_id = users.id
  INNER JOIN provider_postcode_maps
    ON provider_postcode_maps.provider_id = users.id
  INNER JOIN postcodes
    ON postcodes.id = provider_postcode_maps.postcode_id
  INNER JOIN providerservicemaps
    ON providerservicemaps.provider_user_id = users.id
  INNER JOIN userreviews
    ON userreviews.user_review_for = users.id  
  INNER JOIN services
    ON providerservicemaps.service_id = services.id
  INNER JOIN servicecategories
    ON services.category_id = servicecategories.id
  INNER JOIN bookings
    ON bookings.user_id = users.id
  INNER JOIN bookingstatuses
    ON bookings.booking_status_id = bookingstatuses.id  
  where users.is_provider=1 
  AND
   postcodes.postcode LIKE '$postcode' AND postcodes.suburb LIKE 
   '$suburb'
AND servicecategories.name LIKE '$catagories'
AND FIND_IN_SET('$working_day',provider_working_hours.working_days)
AND provider_working_hours.start_time>='$start_time_result'AND provider_working_hours.end_time>='$end_time_result'
AND bookings.booking_time>='$start_time_result'
AND bookings.number_of_hours>='$work_hours'

GROUP BY users.first_name,

      users.last_name,
      providerservicemaps.amount,
      userreviews.user_review_for,
      users.profilepic,
      postcodes.postcode,
      postcodes.suburb,
      servicecategories.name,
      provider_working_hours.start_time,
  provider_working_hours.end_time;

This is your source of error:这是您的错误来源:

 ( SELECT COUNT(bookings.user_id) as cleanings
    FROM users INNER JOIN bookings
    ON bookings.user_id = users.id 
    WHERE users.is_provider = 1 
    AND bookings.booking_status_id = 4 GROUP BY user.id) AS cleanings

If you want to return someting as a column it needs to be an atomic value.如果您想将某些内容作为列返回,则它需要是原子值。 So you cannot return multiple rows.所以你不能返回多行。

Not having any context, I can just give you a way to get rid of the error by using a CTE.没有任何上下文,我可以给你一种通过使用 CTE 来消除错误的方法。 You will have to decide if the logic is preserved.您必须决定是否保留逻辑。

WITH CTE AS 
( SELECT users.user_id, COUNT(bookings.user_id) as cleanings
        FROM users INNER JOIN bookings
        ON bookings.user_id = users.id 
        WHERE users.is_provider = 1 
        AND bookings.booking_status_id = 4 
    GROUP BY user.id
)
 SELECT 

  CTE.cleanings,
  users.first_name,
  users.last_name,
  providerservicemaps.amount,
  TRUNCATE(SUM(userreviews.rating)*5/(COUNT(userreviews.user_review_by)*5), 
  1) AS rating,
  users.profilepic,
  postcodes.postcode,
  postcodes.suburb,
  servicecategories.name,
  provider_working_hours.start_time,
  provider_working_hours.end_time
FROM users 
  INNER JOIN CTE 
    ON CTE.user_id=users.user_id
  INNER JOIN provider_working_hours
    ON provider_working_hours.provider_id = users.id
  INNER JOIN provider_postcode_maps
    ON provider_postcode_maps.provider_id = users.id
  INNER JOIN postcodes
    ON postcodes.id = provider_postcode_maps.postcode_id
  INNER JOIN providerservicemaps
    ON providerservicemaps.provider_user_id = users.id
  INNER JOIN userreviews
    ON userreviews.user_review_for = users.id  
  INNER JOIN services
    ON providerservicemaps.service_id = services.id
  INNER JOIN servicecategories
    ON services.category_id = servicecategories.id
  INNER JOIN bookings
    ON bookings.user_id = users.id
  INNER JOIN bookingstatuses
    ON bookings.booking_status_id = bookingstatuses.id  
  where users.is_provider=1 
  AND
   postcodes.postcode LIKE '$postcode' AND postcodes.suburb LIKE 
   '$suburb'
AND servicecategories.name LIKE '$catagories'
AND FIND_IN_SET('$working_day',provider_working_hours.working_days)
AND provider_working_hours.start_time>='$start_time_result'AND provider_working_hours.end_time>='$end_time_result'
AND bookings.booking_time>='$start_time_result'
AND bookings.number_of_hours>='$work_hours'

GROUP BY users.first_name,

      users.last_name,
      providerservicemaps.amount,
      userreviews.user_review_for,
      users.profilepic,
      postcodes.postcode,
      postcodes.suburb,
      servicecategories.name,
      provider_working_hours.start_time,
  provider_working_hours.end_time;

An alternative would be to use a correlated subquery for the cleanings column like so:另一种方法是对清洗列使用相关子查询,如下所示:

( SELECT COUNT(bookings.user_id) as cleanings
    FROM bookings
    WHERE user_id = users.id 
    WHERE booking_status_id = 4 ) AS cleanings

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM