0

我有两张桌子。其中一个被命名files并且有所有文件的所有列表。第二个表名为payments,其中有一些文件的付款清单。

付款:

id | fileid | {...}
 1   2
 2   3
 3   2

文件:

id | {...}
1
2
3

我想选择所有文件,并加入该表payments以按该表的计数排序。

在这种情况下,第一行将是文件 #2,因为它在payments表中重复次数最多。

我试图这样做,但是当我这样做时 -并不是所有的行都显示出来了!

我认为这是因为并非所有文件都在payments表中。所以在这种情况下,我认为它不会显示第一行。

谢谢,对不起我的英语

PS:我用的是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
4

3 回答 3

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小提琴

于 2013-08-29T14:03:04.790 回答
0

Try LEFT JOIN- 在 MySQL 中,默认JOIN值实际上是一个INNER JOIN. 在 anINNER JOIN中,您只会得到连接两边的结果。

请参阅:MySQL JOIN 与 LEFT JOIN 的区别

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

于 2013-08-29T13:52:01.363 回答
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)

我希望这有帮助。我假设 files 表中的所有 ID 都是唯一的。在此答案中,您可以根据自己的意愿应用 order by 子句。我已将 select 语句留给您选择要获取的任何数据。

就您的问题所描述的而言,我认为这应该可行。如果有任何问题,请发表评论。

于 2013-08-29T14:07:05.193 回答