2016-08-01 56 views
1

的,我有以下表格:設置限制之前的JOIN表

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的開始和結束值。

+0

在子查詢中執行LIMIT部分。 – jarlh

+0

在MySQL中沒有這樣的通用功能。 –

回答

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條記錄似乎很快,100M記錄和副本可能會很慢。

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 BYLIMIT所以查詢返回一致的結果之前。

然而,這不是一般的解決方案,因爲25個IDS在client_purchases選擇可能不匹配file_purchases什麼(他們可以匹配你的情況,但或許不是一般的)。