在表

时间:2016-08-01 13:48:18

标签: mysql sql

我有以下表格:

client_purchases:

id_sale | id_client | timestamp

files_purchases:

id_sale | id_file

因此,只需购买一次客户,他就可以购买许多文件,并且可以多次购买这些文件。

我选择了我想要的东西:

SELECT cp.id_sale, fp.id_file 
FROM client_purchases AS cp 
   JOIN file_purchases AS fp 
   ON cp.id_sale = fp.id_sale;

工作得很好。我得到的是这样的:

id_sale | id_file 
   1         1
   1         2
   1         3
   2         1
   3         1

现在要确保它不会永远用于查看我的数据库,如果它增长,我想限制行数。

SELECT cp.id_sale, fp.id_file 
FROM client_purchases AS cp 
    JOIN file_purchases AS fp 
    ON cp.id_sale = fp.id_sale 
LIMIT 0,25;

惠克给我回了25行。但我实际上想要的是25种不同的" id_sale"。那么是否有一种方法告诉SQL计算列的DESTINCT值并停止该值是否达到指定的数量?我确实需要能够设置LIMIT的开始和结束值。

2 个答案:

答案 0 :(得分:2)

您可以使用JOIN +子查询

SELECT cp.id_sale, fp.id_file 
   FROM (SELECT id, id_sale FROM client_purchases ORDER BY id LIMIT 25) AS cp 
JOIN (SELECT id FROM file_purchases ORDER BY id LIMIT 25) AS fp 
    ON cp.id_sale = fp.id_sale 

然而,这可能会加快您的查询速度,或者可能会使速度变得更慢。这完全取决于您拥有的索引类型以及表中的记录数。

100条记录看起来很快,100条记录和副条文可能会很慢。

答案 1 :(得分:2)

一般没有任何功能。您可以使用子查询来限制ID的数量:

SELECT cp.id_sale, fp.id_file 
FROM (SELECT cp.*
      FROM client_purchases cp 
      LIMIT 25
     ) cp JOIN
      file_purchases fp 
      ON cp.id_sale = fp.id_sale ;

通常情况下,ORDER BY之前会有LIMIT,因此查询会返回一致的结果。

但是,这不是常规解决方案,因为client_purchases中选择的25个ID可能与file_purchases中的任何内容都不匹配(它们可能在您的情况下匹配,但也许不一般)。