Выбор ближайших окружающих строк (выше / ниже) с помощью SQL из набора данных базы данных MySQL - PullRequest
1 голос
/ 14 октября 2011

Я пытаюсь получить из ближайших соседних строк (выше и ниже) запись в наборе результатов, которая соответствует определенному условию.

Моя проблема, кажется, заключается в использовании здесь мин и макс:

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

Я получаю ошибку: error: Неправильное использование групповой функции

Не совсем уверен, что я делаю неправильно

    (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

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

MAX () - это агрегатная функция, в основном ожидаемая для просмотра ряда строк и выдачи одного ответа на каждый элемент группировки.

Если вы хотите узнать MIN или MAX из таблицы ma_entries, вам нужно добавить следующее 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 выше определенного значения И = определенного значения. Я предлагаю пересмотреть пункт «где»

1 голос
/ 14 октября 2011
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)

и то же для следующего запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...