“子查询返回超过1行”错误

时间:2014-03-01 18:32:16

标签: mysql sql subquery

我阅读了很多帖子,但我无法理解要写的错误和查询。

我希望那个有超过1000个的poster_id

SELECT * FROM `posters` 
WHERE title LIKE '%it%'
AND id = (
    SELECT poster_id FROM `poster_likes`
    WHERE action=1
    GROUP BY poster_id
    HAVING COUNT(*) < 100
  )

子查询返回多行。

任何人都可以为我写这个查询。提前谢谢。

4 个答案:

答案 0 :(得分:2)

您可能意味着使用IN()代替=

SELECT * FROM `posters` 
WHERE title LIKE '%it%'
AND id IN (
    SELECT poster_id FROM `poster_likes`
    WHERE action=1
    GROUP BY poster_id
    HAVING COUNT(*) < 100
  )

答案 1 :(得分:0)

您正在使用where id =(subquery)但您的子查询返回多个值,所以:

变化

where id =(subquery) 

where id  in (subquery) 

答案 2 :(得分:0)

您的子查询返回多行。你的条件是id = (more than one thing),sql无法恢复。您可以使用in子句

SELECT * FROM `posters` 
WHERE title LIKE '%it%'
AND id IN ( -- = changed to IN
    SELECT poster_id FROM `poster_likes`
    WHERE action=1
    GROUP BY poster_id
    HAVING COUNT(*) < 100
  )

或仅选择第一个结果。

答案 3 :(得分:-1)

CREATE  PROCEDURE `spLeaves`(IN LId BIGINT, IN EIds LONG VARCHAR, IN McIds LONG VARCHAR, 
    IN DIds LONG VARCHAR, IN SdIds LONG VARCHAR, IN ObIds LONG VARCHAR, 
    IN fromdate VARCHAR(15), IN todate VARCHAR(15), IN stats VARCHAR(25))
BEGIN
SELECT
    levs.LeaveId AS id,
    levs.EmployeeId, levs.REmployeeId,
    CONCAT('L', LPAD(IFNULL(levs.LeaveId,0), 5, '0')) AS LeaveNo,
    ldateformat(levs.RequestDate) AS RDate,
    sdateformat(levs.StartDate) AS SDate,
    sdateformat(levs.EndDate) AS EDate,
    CONCAT(sdateformat(levs.StartDate),' to ',sdateformat(levs.EndDate)) AS Period,
    CONCAT(levstyp.LeaveTypeName,' Leave') AS title,
    levs.*, levstyp.LeaveTypeName AS Nature, spc.SpecialLeaveName, 
    CONCAT(emp.FirstName,' ',emp.LastName) AS EmployeeName, emp.LeaveCategoryId,
    CONCAT(emp2.FirstName,' ',emp2.LastName) AS LeaveBy,
    CASE levs.IsMedicalCertificate WHEN 1 THEN "Yes" ELSE "No" END AS Medical,
    (SELECT CONCAT(emp.FirstName,' ',emp.LastName) AS EmployeeName FROM tblemployees AS emp INNER JOIN tblapproveleaves AS apr ON emp.EmployeeId = apr.EmployeeId WHERE apr.LeaveId = levs.LeaveId ORDER BY LeaveApproveId DESC LIMIT 1) AS ApprovedBy,
    (SELECT ldateformat(apr.Date) AS ADate FROM tblemployees AS emp INNER JOIN tblapproveleaves AS apr ON emp.EmployeeId = apr.EmployeeId WHERE apr.LeaveId = levs.LeaveId ORDER BY LeaveApproveId DESC LIMIT 1) AS ApprovedDate,
    (SELECT apr.GrantedDays FROM tblemployees AS emp INNER JOIN tblapproveleaves AS apr ON emp.EmployeeId = apr.EmployeeId WHERE apr.LeaveId = levs.LeaveId ORDER BY LeaveApproveId DESC LIMIT 1) AS GrantedDays,
    (SELECT CONCAT(emp.FirstName,' ',emp.LastName) AS EmployeeName FROM tblemployees AS emp INNER JOIN tblleavescancellation AS cls ON emp.EmployeeId = cls.EmployeeId WHERE cls.LeaveId = levs.LeaveId ORDER BY LeaveCancellationId DESC LIMIT 1) AS CancelledBy,
    (SELECT ldateformat(cls.Date) AS CDate FROM tblemployees AS emp INNER JOIN tblleavescancellation AS cls ON emp.EmployeeId = cls.EmployeeId WHERE cls.LeaveId = levs.LeaveId ORDER BY LeaveCancellationId DESC LIMIT 1) AS CancelledDate
FROM
    tblleaves AS levs INNER JOIN
    tblleavestypes AS levstyp ON levs.LeaveTypeId = levstyp.LeaveTypeId LEFT JOIN
    tblspecialleaves AS spc ON levs.SpecialLeaveId = spc.SpecialLeaveId INNER JOIN
    tblemployees AS emp ON levs.EmployeeId = emp.EmployeeId LEFT JOIN
    tblemployees AS emp2 ON levs.REmployeeId = emp2.EmployeeId

WHERE
    (levs.LeaveId = LId OR LId = 0)
AND
    (FIND_IN_SET(levs.EmployeeId, EIds) OR EIds IS NULL)
AND
    (FIND_IN_SET(emp.LeaveCategoryId, McIds) OR McIds IS NULL)
AND
    (DATE_FORMAT(levs.RequestDate,'%Y-%m-%d') BETWEEN DATE_FORMAT(fromdate,'%Y-%m-%d') AND DATE_FORMAT(todate,'%Y-%m-%d') OR fromdate IS NULL)
AND
    (levs.Status = stats OR stats IS NULL)
ORDER BY
    levs.LeaveId DESC;
END
相关问题