SQL 选择 - 某些行不会显示
Posted
技术标签:
【中文标题】SQL 选择 - 某些行不会显示【英文标题】:SQL Select - Some Rows Won't Display 【发布时间】:2013-09-01 23:49:52 【问题描述】:我有两张桌子。其中一个名为files
,并且有所有文件的所有列表。第二个表名为payments
,其中有一些文件的付款清单。
付款:
id | fileid | ...
1 2
2 3
3 2
文件:
id | ...
1
2
3
我想选择所有文件,并加入表 payments
以按此表的计数排序。
在这种情况下,第一行将是文件 #2,因为它在 payments
表中重复次数最多。
我尝试这样做,但当我这样做时 - 并非所有行都显示!
我认为这是因为并非所有文件都在 payments
表中。所以在这种情况下,我认为它不会显示第一行。
谢谢,对不起我的英语
P.S:我用的是mysql引擎
** 更新 ** 我的代码:
SELECT `id`,`name`,`size`,`downloads`,`upload_date`,`server_ip`,COUNT(`uploadid`) AS numProfits
FROM `uploads`
JOIN `profits`
ON `uploads`.`id` = `profits`.`uploadid`
WHERE `uploads`.`userid` = 1
AND `removed` = 0
ORDER BY numProfits
【问题讨论】:
您能否提供您对示例数据的期望输出?还有您尝试过的查询。 你的SQL语句是什么?您可能会遇到内连接和外连接之间的区别。 我把我的代码,请看更新 【参考方案1】:试试LEFT JOIN
——在MySQL中,默认的JOIN
实际上是INNER JOIN
。在INNER JOIN
中,您只会得到连接两边的结果。
见:Difference in MySQL JOIN vs LEFT JOIN
并且,如 cmets 中所述,您可能还需要一个 GROUP BY
和您的 COUNT
,以防止它只计算所有返回的行。
【讨论】:
它只返回一行。uploads
表是否与您在示例中提到的files
表相同?我无法弄清楚如何在执行LEFT JOIN
时获得更少的行数(根据定义,它返回的数字与INNER JOIN
相同或更大)。
我写了files
,但我提到了uploads
我认为他只得到一行的原因与计数和缺少 GROUP BY 之间的相互作用有关。虽然我不确定细节。指定组可以解决问题。 - 确实,INNER JOIN 也只返回一行,但支付表中有三行 - 因此计数为三。
@ArielAharonson Count 是一个聚合运算符 - 我会检查,当您执行返回一行的查询时,返回的 COUNT
是否为三,如果是这样,请添加合适的GROUP BY
。【参考方案2】:
正如其他人所指出的,您需要使用 LEFT JOIN。 - 这告诉 MySQL 即使右侧表中不存在相应条目,也应包含左侧表中的条目。
您还应该使用 GROUP BY 来指示应如何分隔 COUNT。
所以 SQL 应该是这样的;
SELECT Files.ID, count(Payments.FileID) as numpays FROM
Files
LEFT OUTER JOIN
Payments
ON Files.id=Payments.FileID
GROUP BY files.ID
ORDER BY numpays desc
SQL Fiddle
【讨论】:
【参考方案3】:试试这个:
select B.fileid,A......
from
(select id,.....
from files A
inner join
(select count(*),fileid,.....
from payments
group by fileid) B
on files.id=payments.fileid)
我希望这会有所帮助。我假设 files 表中的所有 ID 都是唯一的。在此答案中,您可以根据自己的意愿应用 order by 子句。我已将 select 语句留给您选择要获取的任何数据。
就您所描述的问题而言,我认为这应该可行。如果有任何问题,请发表评论。
【讨论】:
以上是关于SQL 选择 - 某些行不会显示的主要内容,如果未能解决你的问题,请参考以下文章
sql 显示如何选择某些列内容的COUNT和SUM。第1行从Customers表中选择列,以及COUNT
在滚动触发之前,某些项目不会显示在 SectionList 中