2014-02-24 55 views
-1
過濾器記載未知列設置
SELECT 
    contract.id AS contract_id, 
    contract.currency_code, 
    contract_period.date_from AS rate_period_date_from, 
    contract_period.date_to AS rate_period_date_to, 
    DATEDIFF(
     contract_period.date_to, 
     contract_period.date_from 
    ) AS no_of_days 
FROM 
    contract 
INNER JOIN contract_period ON contract_period.contract_id = contract.id 
WHERE 
    contract.section_id = 6 
AND contract.market_id = 1 
AND contract.company_id = 8 
AND (
    contract_period.date_from >= '2014-05-01' 
    AND contract_period.date_to <= '2014-10-31' 
) 
ORDER BY 
    contract.id DESC, 
    contract_period.date_from ASC 

    -> ; 

+-------------+---------------+-----------------------+---------------------+------------+ 
| contract_id | currency_code | rate_period_date_from | rate_period_date_to | no_of_days | 
+-------------+---------------+-----------------------+---------------------+------------+ 
|   8 | USD   | 2014-07-01   | 2014-07-31   |   30 | 
|   8 | USD   | 2014-08-01   | 2014-08-31   |   30 | 
|   8 | USD   | 2014-09-01   | 2014-10-31   |   60 | 
|   7 | USD   | 2014-05-11   | 2014-05-31   |   20 | 
|   7 | USD   | 2014-06-01   | 2014-06-30   |   29 | 
+-------------+---------------+-----------------------+---------------------+------------+ 
    5 rows in set (0.00 sec) 

我需要從記錄集獲得第3(有時多於或少於3)。 where子句中不能使用字段「contract_id」。有沒有辦法在mySQL中做到這一點?如何在MySQL

請幫忙。謝謝!

+0

你的問題很困惑解釋清楚? – Sathish

+0

我需要執行上面的查詢,結果看起來像上面給出的。 但我需要得到與一個「contract_id」相關的結果。 8. 我想要得到的所有結果與「Contract_id」等於8。但是我不能在where子句中使用「contract_id」。因爲它取決於查詢的結果。 – user2947024

回答

0

如果我理解正確,您需要結果的一個子集,其中contract.id與結果中的第一行相同。

如果是這樣,您需要一個具有相同表引用,條件和按列排序的子查詢。子查詢確定最低的contract.id,外部查詢選擇contract.id等於那個的結果。

試試這個:

SELECT 
    contract.id AS contract_id, 
    contract.currency_code, 
    contract_period.date_from AS rate_period_date_from, 
    contract_period.date_to AS rate_period_date_to, 
    DATEDIFF(
     contract_period.date_to, 
     contract_period.date_from 
    ) AS no_of_days 
FROM 
    contract 
INNER JOIN 
    contract_period 
     ON contract_period.contract_id = contract.id 
WHERE 
    contract.section_id = 6 
    AND contract.market_id = 1 
    AND contract.company_id = 8 
    AND contract_period.date_from >= '2014-05-01' 
    AND contract_period.date_to <= '2014-10-31' 
    AND contract.id = (
     SELECT 
      MIN(contract.id) 
     FROM 
      contract 
     INNER JOIN 
      contract_period 
       ON contract_period.contract_id = contract.id 
     WHERE 
      contract.section_id = 6 
      AND contract.market_id = 1 
      AND contract.company_id = 8 
      AND contract_period.date_from >= '2014-05-01' 
      AND contract_period.date_to <= '2014-10-31' 
     ORDER BY 
      contract.id DESC, 
      contract_period.date_from ASC 
    ) 
ORDER BY 
    contract.id DESC, 
    contract_period.date_from ASC 
+0

感謝您的回覆!我有一個問題,如果數據庫中有很多記錄,那麼SUB QUERY的性能如何?謝謝! – user2947024

+0

很大程度上取決於表的索引方式。要知道的唯一方法就是嘗試一下。 – toxalot

0

您可以使用LIMIT來獲取所需的行數。

+0

感謝您的回覆。不,我需要獲得等於8的所有記錄。行數可能會不同。 – user2947024

+0

那你爲什麼不用'where' ..? – vivekpansara

+0

因爲我不知道結果集中的「contract_id」。 – user2947024