SQL Select - 某些行不会显示

时间:2013-08-29 13:46:06

标签: mysql sql join

我有两张桌子。其中一个名为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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尝试LEFT JOIN - 在MySQL中,默认JOIN实际上是INNER JOIN。在INNER JOIN中,您只会获得在联接两侧的结果。

请参阅:Difference in MySQL JOIN vs LEFT JOIN

并且,正如评论中所述,您可能还需要GROUP BYCOUNT,以防止它只计算所有返回的行。

答案 2 :(得分:0)

试试这个:

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)

我希望这会有所帮助。我假设文件表中的所有ID都是唯一的。在这个答案中,您可以根据自己的意愿应用order by子句。我已经把select语句留给你来选择你想要获取的数据。

就你的问题所描述,我认为这应该有效。如果有任何问题,请发表评论。