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

#mysql #sql #database

#mysql #sql #База данных

Вопрос:

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

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

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

Ошибка, которую я получаю,:
ошибка: недопустимое использование функции group

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

     (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))
  

ОБЪЕДИНЕНИЕ

     (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 для запроса, который я пытаюсь выполнить
введите описание изображения здесь

Ответ №1:

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

Если вы хотите узнать МИНИМАЛЬНОЕ или МАКСИМАЛЬНОЕ значение из таблицы ma_entries, вам необходимо добавить следующее соединение

 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()…

Однако я не думаю, что предложение WHERE является правильным, потому что вы запрашиваете строки с идентификатором выше определенного значения И = определенное значение. Я предлагаю пересмотреть ваше предложение where

Ответ №2:

 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)
  

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