ПОРЯДОК Mysql ПО RAND () ОГРАНИЧИВАЕТ 1 проблему

#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 нет) вместо этого используются нули.

Вопреки предыдущему комментарию количество строк не обязательно должно быть равным.