2011-10-13 24 views
1

我試圖檢索匹配特定條件的結果集中最接近的相鄰行(高於和低於)記錄。從MySQL數據庫結果集中用SQL選擇最接近的周邊行(上/下)

我的問題似乎是在我使用的最小和最大這裏:

WHERE ma_c.id = 2 
      AND ma_e.id > 4 
      AND ma_e.id = MIN(ma_e.id)) 

我收到的錯誤是: 錯誤:無效使用組功能的

不太清楚我是什麼做正確

(SELECT  
     ma_c.id     as contest_id, 
     ma_c.name    as name, 
     ma_c.title    as title, 
     ma_u.id     as user_id, 
     ma_u.first_name   as user_first_name, 
     ma_u.last_name   as user_last_name, 
     ma_u.street_address  as user_street_address, 
     ma_u.city    as user_city, 
     ma_u.zip_code   as user_zip_code, 
     ma_u.email    as user_email, 
     ma_u.phone_number  as user_phone_number, 
     ma_u.country_code  as user_country_code, 
     ma_u.gender    as user_gender, 
     ma_u.dob    as user_dob, 
     ma_u.ssn    as user_ssn, 
     ma_u.canadian_province as user_canadian_province, 
     ma_u.state    as user_state, 
     ma_e.id     as entry_id, 
     ma_e.hash_id   as entry_hash_id, 
     ma_e.create_datetime as entry_create_datetime, 
     ma_e.entry_type   as entry_type, 
     ma_e.title    as entry_title 
    FROM ma_contests ma_c 
    JOIN ma_users ma_u 
    ON  ma_c.id = ma_u.contests_id 

    JOIN ma_entries ma_e 
    ON  ma_u.id = ma_e.users_id 

    WHERE ma_c.id = 2 
      AND ma_e.id > 4 
      AND ma_e.id = MIN(ma_e.id)) 

UNION

(SELECT  
     ma_c.id     as contest_id, 
     ma_c.name    as name, 
     ma_c.title    as title, 
     ma_u.id     as user_id, 
     ma_u.first_name   as user_first_name, 
     ma_u.last_name   as user_last_name, 
     ma_u.street_address  as user_street_address, 
     ma_u.city    as user_city, 
     ma_u.zip_code   as user_zip_code, 
     ma_u.email    as user_email, 
     ma_u.phone_number  as user_phone_number, 
     ma_u.country_code  as user_country_code, 
     ma_u.gender    as user_gender, 
     ma_u.dob    as user_dob, 
     ma_u.ssn    as user_ssn, 
     ma_u.canadian_province as user_canadian_province, 
     ma_u.state    as user_state, 
     ma_e.id     as entry_id, 
     ma_e.hash_id   as entry_hash_id, 
     ma_e.create_datetime as entry_create_datetime, 
     ma_e.entry_type   as entry_type, 
     ma_e.title    as entry_title 
    FROM ma_contests ma_c 
    JOIN ma_users ma_u 
    ON  ma_c.id = ma_u.contests_id 

    JOIN ma_entries ma_e 
    ON  ma_u.id = ma_e.users_id 

    WHERE ma_c.id = 2 
      AND ma_e.id < 4 
      AND ma_e.id = MAX(ma_e.id)) 

-----編輯---- 這是查詢相關的架構UML我試圖執行 enter image description here

回答

1
SELECT  
     ma_c.id     as contest_id, 
     ma_c.name    as name, 
     ma_c.title    as title, 
     ma_u.id     as user_id, 
     ma_u.first_name   as user_first_name, 
     ma_u.last_name   as user_last_name, 
     ma_u.street_address  as user_street_address, 
     ma_u.city    as user_city, 
     ma_u.zip_code   as user_zip_code, 
     ma_u.email    as user_email, 
     ma_u.phone_number  as user_phone_number, 
     ma_u.country_code  as user_country_code, 
     ma_u.gender    as user_gender, 
     ma_u.dob    as user_dob, 
     ma_u.ssn    as user_ssn, 
     ma_u.canadian_province as user_canadian_province, 
     ma_u.state    as user_state, 
     ma_e.id     as entry_id, 
     ma_e.hash_id   as entry_hash_id, 
     ma_e.create_datetime as entry_create_datetime, 
     ma_e.entry_type   as entry_type, 
     ma_e.title    as entry_title 
    FROM ma_contests ma_c 
    JOIN ma_users ma_u 
    ON  ma_c.id = ma_u.contests_id 

    JOIN ma_entries ma_e 
    ON  ma_u.id = ma_e.users_id 

    WHERE ma_c.id = 2 
      AND ma_e.id > 4 
      AND ma_e.id = (SELECT min(_ma_e.id)  
          FROM ma_contests _ma_c 
          JOIN ma_users _ma_u 
          ON  _ma_c.id = _ma_u.contests_id 

          JOIN ma_entries _ma_e 
          ON  _ma_u.id = _ma_e.users_id 

          WHERE _ma_c.id = 2 
            AND _ma_e.id > 4) 

和同爲一個查詢

+1

作品完美,感謝@Adrian Iftode :) –

2

的MAX()是一個聚合函數,基本上一個預期查看一堆行,併爲每個分組元素提供單個答案。

如果你想知道從ma_entries表中的MIN或MAX,你需要添加下面的JOIN被

JOIN ma_entries ma_e  ON  ma_u.id = ma_e.users_id  
JOIN (select min(id) as SmallestID FROM ma_entries) xx ON 1=1 

WHERE ma_c.id = 2    
     AND ma_e.id > 4    
     AND ma_e.id = xx.SmallestID 

你可以使用類似的方法爲MAX()ID ...

但是,我不認爲你WHERE子句是正確的,因爲你要求一個ID超過特定值AND =一個特定值的行。我建議您查看where子句