减少SQL查询中的行数和可读性
我有两张桌子: 清单a:减少SQL查询中的行数和可读性,sql,sql-server,Sql,Sql Server,我有两张桌子: 清单a: ID Date pg 23 2016-11-30 sub 23 2016-12-03 sub 23 2016-12-04 sub 23 2016-12-05 sub 69 2017-07-21 Closed 69 2017-07-22 Closed 69 2017-07-23 Closed 92 2016-11-29 sub 92 2016-11-30 sub 46 2017-01-11 In 46 2017-01-12
ID Date pg
23 2016-11-30 sub
23 2016-12-03 sub
23 2016-12-04 sub
23 2016-12-05 sub
69 2017-07-21 Closed
69 2017-07-22 Closed
69 2017-07-23 Closed
92 2016-11-29 sub
92 2016-11-30 sub
46 2017-01-11 In
46 2017-01-12 In
46 2017-01-13 In
清单b:
ID Name
23 B
46 B
69 X
92 B
我的任务是编写一个sql查询,这样我就可以得到名为“B”的每个日期的计数,并且计数应该大于4
到目前为止,我已经编写了以下查询,它为我提供了输出:
SELECT date, count(Name) as CountName FROM
(
SELECT list_b.ID as Id,list_b.Name as Name,Date from list_b
inner JOIN list_a
on list_b.ID=list_a.ID
) t
where Name='B'
group by Date
Having count(Name)>4
order by count(Name) desc;
我正试图使我的查询更具可读性,更简洁。
有没有更好的方法可以解决这个问题
注意:以上表格是原始表格的片段 不幸的是,您不能在mysql中使用CTE with子句,但您可以创建临时表:
CREATE TEMPORARY TABLE IF NOT EXISTS t AS (
SELECT list_b.ID AS Id,list_b.Name AS Name,Date
FROM list_b
INNER JOIN list_a ON list_b.ID=list_a.ID
);
SELECT date, count(Name) AS CountName
FROM t
WHERE Name='B'
GROUP BY Date HAVING count(Name)>4
ORDER BY count(Name) DESC;
您有一个不必要的备用子查询。另外,在名为t_databaseassociation的表上使用别名而不是表名也是个人的偏好。这确实会产生很大的不同 试一试
您的查询将对您的数据产生空结果。@PHPNinja否,OP不需要枚举记录。临时表过多。我编辑了我的答案,您说得很对,group by 1将无法在sql server中工作。请参阅-@LJ01分组依据1是否有效???是的,可以使用输出中字段的位置号代替GROUP BY和ORDER BY子句中的名称/表达式。这在sql server中有效吗?我的巴迪并不是想说这是无效的,只是我的一个新把戏。。。当我下一个站在一辆汽车前面时,我会试试的pc@Akina . . . 位置字段号的使用是ORDER BY标准的一部分,尽管我认为这是不推荐的。它不是GROUP BY的标准SQL,也不支持列别名。有些数据库扩展SQL以允许它们。自然联接是一种讨厌的做法,因为它没有考虑正确声明的外键引用。我强烈建议你不要使用它。
SELECT `Date`, COUNT(Name) as CountName
FROM list_a
NATURAL JOIN list_b
WHERE Name = 'B'
GROUP BY `Date`
HAVING COUNT(Name) > 4
ORDER BY CountName DESC;
SELECT
list_b.Date AS date,
count(Name) AS CountName
FROM list_b
INNER JOIN list_a ON list_b.ID=list_a.ID
WHERE list_b.Name = 'B'
GROUP BY list_b.Date HAVING count(list_b.Name) > 4
ORDER BY count(Name) DESC
SELECT date, count(name) as countname
from list_b b
inner JOIN list_a a on b.ID= a.ID
where Name='B'
group by Date
Having count(Name)>4
order by count(Name) desc;