#mysql #sql #greatest-n-per-group
#mysql #sql #наибольшее число пользователей на группу
Вопрос:
Проблема заключается в следующем запросе.
SELECT RSV.Value
FROM tblsubmitedservice SS
LEFT JOIN (SELECT ServiceID, Value
FROM tblservicevalue
ORDER BY RAND()
LIMIT 1) RSV ON RSV.ServiceID = SS.ServiceID
Этот запрос должен извлечь 1 случайное значение из tblservicevalue в соединении с tblsubmitedservice, как указано выше. Но иногда (я не знаю, почему иногда) запрос возвращает null
. Если я переместу «ОГРАНИЧЕНИЕ 1» в конец запроса (больше не внутри подзапроса), запрос будет выполнен правильно.
Этот запрос упрощен для понимания, и в исходном запросе это решение невозможно.
Комментарии:
1. В том, что вы опубликовали, есть фундаментальное недопонимание. Производная от ЛЕВОГО СОЕДИНЕНИЯ таблица будет выполнена один раз , а не для каждого
serviceid
значения вSUBMITEDSERVICE
таблице.2. Во-вторых, зачем вам ОСТАВЛЯТЬ соединение с источником того, что вы хотите вернуть? Запрос как есть
NULL
может быть возвращен — в нескольких столбцах.3. Потому что это не исходный запрос (как сказано). У меня есть другой,
LEFT JOIN tblservicevalue
который извлекает X-вид отправленного служебного значения иLEFT JOIN (SELECT ServiceID, Value...
случайным образом извлекает только Y-вид.
Ответ №1:
Возможно, все идентификаторы serviceId в tblservicevalue не имеют соответствующих идентификаторов serviceId в tblsubmittedservice, т.Е. между таблицами нет строгого отношения «один к одному».
Вы можете проверить таблицы, используя это:
1> Проверьте, равно ли количество строк tblservicevalue и tblsubmittedservice. 2> Следующая проверка, если
SELECT
RSV.Value
FROM tblsubmitedservice SS
LEFT JOIN (SELECT ServiceID, Value FROM tblservicevalue) RSV ON RSV.ServiceID=SS.ServiceID
имеет то же количество строк, что и tblservicevalue,tblsubmittedservice.
Если любой из 1,2 завершается неудачей, очевидно, что поведение вызвано причиной, которую я объяснил выше.
Комментарии:
1. Я тестирую этот запрос с правильными ограниченными данными, поэтому все данные имеют соответствующее значение в обеих таблицах. И я не знаю, почему количество строк tblservicevalue и tblsubmittedservice должно быть равным. Я должен получить значение из tblservicevalue для каждой отправленной службы в tblsubmittedservice.
2. Пожалуйста, перефразируйте свой комментарий. Я не мог понять, что вы хотели сказать: (
Ответ №2:
Проверьте, возвращает ли приведенный ниже запрос какие-либо строки:
SELECT RSV.Value
FROM tblsubmitedservice SS
LEFT JOIN tblservicevalue RSV ON RSV.ServiceID = SS.ServiceID
WHERE RSV.ServiceID IS NULL
Если он возвращает какие-либо строки, это означает, что некоторые строки из tblsubmitedservice не имеют соответствующих строк в tblservicevalue (в отношении поля serviceId). В случае ЛЕВОГО соединения, если строки с правой стороны не могут быть найдены (т. Е. в таблице RSV такого RSV.serviceId нет) вместо этого используются нули.
Вопреки предыдущему комментарию количество строк не обязательно должно быть равным.