0

是否可以向 AS 添加 WHERE 语句?当我像这样运行sql时总是失败。我只需要某种示例,但我在搜索中找不到任何东西。

SELECT *, 
COUNT(my_other_table.id) as 'c_others' WHERE my_other_table.active = 1
LEFT JOIN my_other_table on my_accounts.id = my_other_table.account_connection
FROM my_accounts
ORDER BY my_accounts.name

请注意我如何添加 WHERE my_other_table.active = 1,这就是我破坏一切的地方

我不是 100% 确定 AS 语句是如何工作的,通常我不会对它们做任何复杂的事情。但现在我需要,我无法弄清楚

4

4 回答 4

5

WHERE子句必须位于表列表的末尾,在可选的ORDER BY. 查看 SELECT 语句必须遵守的结构定义:

SELECT 
[ DISTINCT | ALL ] 
  <select list>
  FROM <table reference list>
[ <where clause> ]             <-- THIS IS THE INTERESTING PART
[ <group by clause> ]
[ <having clause> ]
[ UNION [ALL] <query specification> ]
[ <order by clause> ]

所以你的查询应该是这样的:

SELECT *, COUNT(my_other_table.id) AS c_others
FROM my_accounts
LEFT JOIN my_other_table ON my_accounts.id = my_other_table.account_connection
WHERE my_other_table.active = 1
ORDER BY my_accounts.name

您还可以将条件添加到您的ON子句中:

SELECT *, COUNT(my_other_table.id) AS c_others
FROM my_accounts
JOIN my_other_table ON 
   my_accounts.id = my_other_table.account_connection
   AND my_other_table.active = 1
ORDER BY my_accounts.name

AS语句除了为选定字段指定别名外,什么都不做。当字段名太长时,这可能很有用,您想为函数调用定义一个名称(例如COUNT(column) AS counter,就像您使用它一样)或在连接具有相似列名的表时避免名称冲突。您还可以使用AS表名指定别名以避免必须多次键入它。

编辑:

正如 HamletHakobyan 的评论中所述:COUNT是一个聚合函数,可能需要您GROUP BY在语句中选择的其他字段上使用子句。因此,您需要将其扩展*为实际的字段名并这样做:

SELECT
   my_accounts.name, 
   my_accounts.firstname, 
   COUNT(my_other_table.id) AS c_others
FROM my_accounts
JOIN my_other_table ON 
   my_accounts.id = my_other_table.account_connection
   AND my_other_table.active = 1
GROUP BY my_accounts.name, my_accounts.firstname
ORDER BY my_accounts.name
于 2013-04-24T10:52:55.173 回答
0

您可以将WHERE子句添加为:

SELECT *, 
    COUNT(my_other_table.id) as 'c_others'
FROM my_accounts
    LEFT JOIN my_other_table
        ON my_accounts.id = my_other_table.account_connection
WHERE my_other_table.active = 1
GROUP BY <list all necessary fields>
ORDER BY my_accounts.name

或者,如果您想获得元素的选择性计数,请使用此

SELECT <list all necessary fields>, 
    COUNT(CASE WHEN my_other_table.active = 1 THEN my_other_table.id END) as 'c_others'
FROM my_accounts
    LEFT JOIN my_other_table
        ON my_accounts.id = my_other_table.account_connection
GROUP BY <list all necessary fields>
ORDER BY my_accounts.name
于 2013-04-24T10:53:05.340 回答
0

AS只是为对象(列、表等)引入了一个新名称。因此,WHERE对它应用 a 没有意义(因为在这种情况下,列的名称)对于整个结果集都是固定的。

猜测一下,您实际上想要修改COUNT, 以便您只计算那些active为 1 的行:

SELECT *, 
SUM(CASE WHEN my_other_table.active = 1 THEN 1 ELSE 0 END) as 'c_others'
LEFT JOIN my_other_table on my_accounts.id = my_other_table.account_connection
FROM my_accounts
ORDER BY my_accounts.name
于 2013-04-24T10:53:22.010 回答
0

AS 只是为列命名的关键字。这在复杂的列定义中很方便。该名称仅在查询结果中有效,但在查询中无效 - 您不能在同一查询中引用它。然后你必须使用子查询。

正如 Till Helge 所写的那样,WHERE(以及其他关键字)在 Query 中占有一席之地。

于 2013-04-24T11:01:10.587 回答