2010-11-13 111 views
1

我有以下SQL語句:問題的複雜SQL語句

SELECT 
COUNT(table2.programName), 
table2.programName 
FROM 
table1 
LEFT JOIN 
table2 
ON 
table1.programID = table2.programID 
WHERE 
table1.MemberID = 12345 
AND 
table2.programName = (table2.programName associated with dynamic table2.programID) 

我的確意識到了最後的,語句是當前無效,但它似乎什麼我不能左右我的頭。雖然我可以通過插入已知值成功執行查詢,但查詢需要動態生成(使用php完成),並且該值將顯示爲變量。我只是放在括號內以顯示我正在努力完成的事情。

任何想法我將如何去尋找在單個sql語句中的圓括號中與programID關聯的programName?

編輯 - 可能的答案

所以在測試出多一些,我想我可能已經找到了答案,但我不能確定它是否「好」的做法。這裏是我的代碼:

SELECT 
    COUNT(table2.programName), 
    table2.programName 
FROM 
    table1 
LEFT JOIN 
    table2 
ON 
    table1.programID = table2.programID 
WHERE 
    table1.MemberID = 12345 
AND 
    table2.programName = (SELECT table2.programName FROM table2 WHERE table2.programID = $id); 

回答

2

用途:

SELECT t2.programname, 
      COUNT(t2.programname) 
    FROM TABLE2 t2 
LEFT JOIN TABLE1 t1 ON t1.programid = t2.programid 
        AND t1.memberid = 12345 
    WHERE t2.programid = $id 
GROUP BY t2.programname 
+0

@OMG小馬 - 你的代碼和我上面編輯的一樣,是否真的有一個首選的方法? – JM4 2010-11-13 01:24:16

+0

@ JM4:你自己的查詢沒有意義。使用聚合函數並選擇另一個沒有分組的列將選擇一個完全隨機的程序名稱。 WHERE子句顯然會使它選擇正確的,但是查詢不會在大多數RDBMS上執行。 – 2010-11-13 01:26:49

+0

@ JM4:您不需要發佈子查詢,也不需要進行更多的表掃描。 – 2010-11-13 01:27:21

0

假設表2具有自我的關係,這是一個可能的解決方案:

SELECT 
    COUNT(table2.programName), 
    table2.programName 
FROM 
    table1 
LEFT JOIN 
    table2 
ON 
    table1.programID = table2.programID 
LEFT JOIN 
    table2 as t2again 
ON 
    t2again.mysteriousAssociationChild = table2.mysteriousAssociationFather 
WHERE 
    table1.MemberID = 12345 
AND 
    table2.programName = t2again.programName 

訣竅是,SQL允許具有相同的表多次,你想。在這個說明性案例中,自我關係由mysteriousAssociationChild和mysteriousAssociationFather代表,其中一個也可以是programID(但這會破壞一些神祕:)。

讓我知道如果有些事情不清楚。

0

關於直接檢查什麼呢?

SELECT 
    COUNT(table2.programName), 
    table2.programName 
FROM 
    table1 
LEFT JOIN 
    table2 
ON 
    table1.programID = table2.programID 
WHERE 
    table1.MemberID = 12345 
AND 
    table2.programID = $id; 
+0

您的代碼會更改最終結果和目標。我不是想在節目ID上匹配,我想在節目名稱上匹配。在我的系統中,programName可以匹配300個節目ID。 – JM4 2010-11-13 01:19:34

0

這表明所有行的表1中有與ProgramID = $id引用程序MEMBERID = 12345的計數。

SELECT 
    COUNT(table2.programName), 
    table2.programName 
FROM table1 
LEFT JOIN table2 
    ON table1.programID = table2.programID 
WHERE table1.MemberID = 12345 AND table2.ProgramID = $id 
GROUP BY table2.programName 
+0

不是我在找什麼。我以前用過這個。我不是特意返回表名的代碼,只是它不匹配一組 - OMG小馬在下面有正確的答案。 – JM4 2010-11-13 01:27:10

+0

好的,是的,我忘記了'$ id',所以我改變了查詢來包含它,但現在看起來像OMG小馬。呃,好吧。我想你會得到幫助! – thomaspaulb 2010-11-13 01:31:14