#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)
и то же самое для следующего запроса