2013-07-20 61 views
0

我想運行在其where子句中使用外部查詢的值的子查詢。下面是和例子我想做的事:子查詢使用來自where查詢的外部查詢的值

SELECT * FROM `tbl1` 
WHERE `tbl1`.`max_count` < (
SELECT COUNT(*) rc FROM `tbl2` 
WHERE `tbl2`.`id` = `tbl1`.`id 
) 

有TBL1有一個名爲列MAX_COUNT,並有TBL2與指的是行TBL1(多到一的關係)行。我想要做的是選擇tbl1中的行,其中引用它的tbl2中的行數小於該行的max_count值。但我很確定,我在這裏寫的是不會削減的。有任何想法嗎?

非常感謝

回答

1

試試這個 -

SELECT * FROM `tbl1` t1 
    WHERE t1.`max_count` < (
    SELECT COUNT(*) FROM `tbl2` t2 
    WHERE t2.`id` = t1.`id` 
    ) 
+0

我選擇了這個答案比其他兩個,因爲我使用這個在視圖中,並使用任何其他兩個將使視圖代碼要複雜得多。但是IRONY是我自己的代碼在這個問題上也會起作用。當我測試這個答案並看到它正在工作時,我嘗試了沒有別名並再次工作。 :d –

1

嘗試使用JOIN

SELECT DISTINCT a.* 
FROM tb1 a 
     INNER JOIN 
     (
      SELECT id, COUNT(*) totalCount 
      FROM tbl2 
      GROUP BY id 
     ) b ON a.ID = b.ID 
WHERE a.max_count < b.totalCount 
0

作爲一個替代的解決方案,它可能更容易,只需使用一個LEFT JOINHAVING比子查詢;

SELECT tbl1.*, COUNT(tbl2.id) current_count 
FROM tbl1 
LEFT JOIN tbl2 
    ON tbl1.id=tbl2.id 
GROUP BY tbl1.id 
HAVING COUNT(tbl2.id) < max_count 

An SQLfiddle to test with

請注意,在這種情況下,GROUP BY是僅限於MySQL的東西,通常您需要在tbl1中的每個選定字段GROUP BY,即使tbl1.id已知每行都是唯一的。

相關問題