2014-03-01 34 views
1

我讀了很多帖子,但我無法理解錯誤和我的查詢要寫入。「子查詢返回多於一行」錯誤

我想,poster_id有像1000餘像

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 
) 

子查詢返回不止一行。

任何人都可以爲我寫這個查詢。提前致謝 。

回答

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 
) 
+0

也可能想'COUNT(*)> 1000' – trogdor

+0

謝謝...它的工作.... –

0

這裏使用的是where id =(subquery)但你的子查詢返回多個值,所以:

變化

where id =(subquery) 

where id in (subquery) 
+0

MySQL沒有'TOP' –

+0

這隻能返回頂部一個poster_id ......但我想全部 –

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 
) 

或者只選擇第一個結果。

-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 
+0

這與問題完全無關......並且絕不會回答它... – Ben