Mysql ЗАКАЗАТЬ ПО RAND () LIMIT 1 задача - PullRequest
0 голосов
/ 21 мая 2011

Проблема заключается в следующем запросе.

   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 в JOIN с помощью tblsubmitedservice, как описано выше.Но иногда (я не знаю, почему иногда) запрос возвращает null.Если я переместлю «LIMIT 1» в конец запроса (не больше внутри подзапроса), запрос будет выполнен правильно.

Этот запрос упрощен для понимания, и в исходном запросе это решение невозможно.

Ответы [ 2 ]

0 голосов
/ 22 мая 2011

Проверьте, возвращает ли приведенный ниже запрос какие-либо строки:

 SELECT RSV.Value
 FROM tblsubmitedservice SS
 LEFT JOIN tblservicevalue RSV ON RSV.ServiceID = SS.ServiceID
 WHERE RSV.ServiceID IS NULL

Если он возвращает какие-либо строки, это означает, что некоторые строки из tblsubmitedservice не имеют соответствующих строк в tblservicevalue (относительно поля ServiceID).В случае LEFT JOIN, если строки с правой стороны не могут быть найдены (т. Е. В таблице RSV нет такого RSV.ServiceID) Вместо этого используются значения NULL.

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

0 голосов
/ 21 мая 2011

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

...