2010-11-13 96 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