2009-04-22 27 views
17

Tôi đang thực hiện truy vấn này:MySQL subquery trả về nhiều hơn một dòng

SELECT 
    voterfile_county.Name, 
    voterfile_precienct.PREC_ID, 
    voterfile_precienct.Name, 
    COUNT((SELECT voterfile_voter.ID 
FROM voterfile_voter 
JOIN voterfile_household 
WHERE voterfile_voter.House_ID = voterfile_household.ID 
AND voterfile_household.Precnum = voterfile_precienct.PREC_ID)) AS Voters 
FROM voterfile_precienct JOIN voterfile_county 
WHERE voterfile_precienct.County_ID = voterfile_County.ID; 

tôi đang cố gắng để làm cho nó trở lại một cái gì đó như thế này:

County_Name Prec_ID Prec_Name Voters(Count of # of voters in that precienct) 

Tuy nhiên, tôi nhận được lỗi:

#1242 - Subquery returns more than 1 row.

Tôi đã thử đặt câu lệnh COUNT trong truy vấn con nhưng tôi nhận được cú pháp không hợp lệ ror.

+0

@ Dropped.on.Caprica ngừng thông minh. Dữ liệu này là công khai. Bạn có thể tự mình làm cho mục đích học tập. – Eimantas

+0

@Eimantas Lịch sử câu hỏi của ông và những nhận xét về câu trả lời dường như đề xuất khác. Dù bằng cách nào, tôi đã hoàn thành. –

Trả lời

13

Bạn có thể thử nó mà không subquery, với một nhóm đơn giản bằng cách:

SELECT voterfile_county.Name, 
    voterfile_precienct.PREC_ID, 
    voterfile_precienct.Name, 
    count(voterfile_voter.ID) 
FROM voterfile_county 
JOIN voterfile_precienct 
    ON voterfile_precienct.County_ID = voterfile_County.ID 
JOIN voterfile_household 
    ON voterfile_household.Precnum = voterfile_precienct.PREC_ID 
JOIN voterfile_voter 
    ON voterfile_voter.House_ID = voterfile_household.ID 
GROUP BY voterfile_county.Name, 
    voterfile_precienct.PREC_ID, 
    voterfile_precienct.Name 

Khi bạn sử dụng GROUP BY, bất kỳ cột nào mà bạn đang không tập trung vào phải có một mệnh đề tổng hợp (fe SUM hoặc COUNT.) Vì vậy, trong trường hợp này bạn phải nhóm vào tên quận, precienct.id và precient.name.

+0

đã hoạt động, mất 92.5746 giây để thực thi và trả lại kết quả. bất kỳ suy nghĩ về làm thế nào để tăng tốc độ đó? – gsueagle2008

+0

Bạn có chìa khóa nước ngoài cho các mối quan hệ? Điều đó có thể hữu ích. – Andomar

+0

thêm chỉ mục cho tất cả các cột được sử dụng trong các phép nối để tăng tốc. Nếu tập hợp kết quả là lớn, bất cứ điều gì bạn làm để làm cho nó nhỏ hơn cũng sẽ tăng tốc độ nó lên. –

3

Hãy thử điều này

SELECT 
voterfile_county.Name, voterfile_precienct.PREC_ID, 
voterfile_precienct.Name, 
    (SELECT COUNT(voterfile_voter.ID) 
    FROM voterfile_voter JOIN voterfile_household 
    WHERE voterfile_voter.House_ID = voterfile_household.ID 
     AND voterfile_household.Precnum = voterfile_precienct.PREC_ID) as Voters 
FROM voterfile_precienct JOIN voterfile_county 
ON voterfile_precienct.County_ID = voterfile_County.ID 
+0

nó chỉ nói truy vấn đang được thực hiện, đó là xa hơn tôi đã nhận được. nhưng không có súc sắc. – gsueagle2008

+0

Hãy thử thay đổi kết nối, sẽ cập nhật –

+0

nó vẫn chỉ treo lên. – gsueagle2008

59

Nếu bạn gặp lỗi: lỗi số 1242 Truy vấn con trả về nhiều hàng, hãy thử đặt BẤT K before trước truy vấn con của bạn. Ví dụ:

này truy vấn trả lại lỗi:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 

này là tốt truy vấn:

SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2); 
+1

Đây chính xác là những gì tôi cần cho vấn đề của mình. CẢM ƠN BẠN! –

+6

Tại sao cột1 = ANY (truy vấn con) hoạt động và không phải cột1 IN (truy vấn phụ)? Liệu nó không tái tạo cùng một logic quan hệ? – Prusprus

+0

Điều này giải quyết được vấn đề của tôi với việc cập nhật các hàng dựa trên một câu lệnh chọn từ cùng một bảng. – Patrick

3

Xem ví dụ dưới đây và sửa đổi truy vấn của bạn cho phù hợp.

select COUNT(ResultTPLAlias.id) from 
(select id from Table_name where ....) ResultTPLAlias; 
Các vấn đề liên quan