2016-09-15 215 views
0

這裏是我的SQL查詢:限制結果

SELECT 
     asi.nid_lot AS nid_lot, 
     asi.nid_programme AS nid_programme, 
     asi.mensualite_habiter_3p AS mensualite_habiter_3p, 
     ( 
     6371 * acos( 
       cos(radians(45.8219562)) 
       * cos(radians(lat)) 
       * cos(radians(lng) - radians(4.9013965)) 
       + sin(radians(45.8219562)) 
       * sin(radians(lat)) 
       ) 
     ) AS distance 

FROM search_index asi 

WHERE 
    (mensualite_habiter_3p < 875.56) 
    AND (mensualite_habiter_3p > 619.5) 
    ORDER BY distance ASC, mensualite_habiter_3p ASC 

結果我:

enter image description here

如何通過「nid_programme只得到一個結果'?事實上,我們的目標搜索是有這樣的結果:

nid_lot nid_programme mensualite_habiter_3p distance  
1858  1805   676.41     0.00013425878593145295 
1846  1804   683.44     10.090534238610191 
1887  1808   794.4     14.146197138015372 
1816  1792   700.7     36.64897301190563 
1912  1811   774.58     97.35583327362087 
1875  1807   870.43     100.34682452197465 

正如你可以看到有「nid_programme」只有一個迭代(第一個)

+1

您可以根據您的預期獲得一條記錄,但並不完全符合您的預期。您必須選擇nid_lot的最大值或最小值數據,可以接受嗎? – Susang

+0

'正如你所看到的,'nid_programme'(第一個)只有一個迭代'換句話說,mensualite_habiter_3p最低的那個? – Strawberry

+0

是的最低mensualite_habiter_3p – Gaius

回答

0

嘗試group by

SELECT 
    asi.nid_lot     AS nid_lot, 
    asi.nid_programme    AS nid_programme, 
    MIN(asi.mensualite_habiter_3p) AS mensualite_habiter_3p, 
    (6371 * acos(cos(radians(45.8219562)) * cos(radians(lat)) * cos(radians(lng) - radians 
    (4.9013965)) + sin(radians(45.8219562)) * sin(radians(lat)))) AS distance 
FROM 
    nh_actweb_search_index asi 
WHERE 
    (
     mensualite_habiter_3p < 875.56) 
AND (
     mensualite_habiter_3p > 619.5) 
GROUP BY 
    asi.nid_programme 
ORDER BY 
    distance ASC, 
    mensualite_habiter_3p ASC 
0

如果你想爲每個nid_programme只獲取一行,並且我認爲nid_lot保存着唯一的數據,那麼請試試這個,所以根據max或min nid_id你可以對該行進行圖片處理,但是如你所說,基於最低mensualite_habiter_3p,你可以嘗試以下操作。

---基於mensualite_habiter_3p

SELECT 
    a.nid_lot, 
    a.nid_programme, 
    a.mensualite_habiter_3p, 
    a.distance 
FROM tmptest a 
INNER JOIN (SELECT b.nid_programme, MIN(b.mensualite_habiter_3p) tot 
      FROM tmptest b 
      GROUP BY b.nid_programme) t ON t.tot = a.mensualite_habiter_3p 
AND a.nid_programme = t.nid_programme 
0

的最小值從你已經張貼期望的結果,它看起來像你想按[nid_programme]並使用分鐘的其餘列:

SELECT 
     MIN(asi.nid_lot) AS nid_lot, 
     asi.nid_programme AS nid_programme, 
     MIN(asi.mensualite_habiter_3p) AS mensualite_habiter_3p, 
     MIN(( 
     6371 * acos( 
       cos(radians(45.8219562)) 
       * cos(radians(lat)) 
       * cos(radians(lng) - radians(4.9013965)) 
       + sin(radians(45.8219562)) 
       * sin(radians(lat)) 
       ) 
     )) AS distance 

FROM search_index asi 
WHERE 
    (mensualite_habiter_3p < 875.56) 
    AND (mensualite_habiter_3p > 619.5) 
GROUP BY asi.nid_programme 
ORDER BY MIN(( 
     6371 * acos( 
       cos(radians(45.8219562)) 
       * cos(radians(lat)) 
       * cos(radians(lng) - radians(4.9013965)) 
       + sin(radians(45.8219562)) 
       * sin(radians(lat)) 
       ) 
     )) ASC, MIN(asi.mensualite_habiter_3p) ASC