2013-12-05 5 views
1

У меня есть SQL запросБолее 1 результат SQL запроса

SELECT RV.duration, 
     P.expirytime 
FROM rid_purchase_info_v64 AS P 
     INNER JOIN rid_video_asset_movievod AS RV 
       ON RV.rid = P.rid 
WHERE RV.rid = 31041; 

я получаю результат

7166|1386308217

143|1386308217 Почему я получаю 2 результатов вместо 1

+0

Пожалуйста, пост (а) CREATE TABLE заявления и (б) INSERT INTO ... VALUES STA которые необходимы для воспроизведения ваших результатов. В противном случае людям будет сложно помочь вам. – Fabian

+0

Можете ли вы сделать sqlfiddle –

+0

Почему вы ожидаете получить только один результат, если у вас есть две подходящие строки? –

ответ

1

Как насколько я понимаю, таблица rid_purchase_info_v64 находится в одном-единственном соотношении с таблицей rid_video_asset_movievod. В RV есть несколько записей, связанных с P. Многие разработчики помещают атрибут «deleted» или «status = disable», чтобы скрыть нежелательную строку.

Что вам нужно сделать, так это идентифицировать такой атрибут и ввести инструкцию where. Это очень распространенная проблема с новичками.

+0

Точно. Когда я делаю 'select * from rid_video_asset_movievod, где rid = 31041' Я получаю 2 разных результата, каждый из которых имеет разные строки. – Arya

1

Если вы хотите, чтобы показать только один ряд, то попробуйте использовать LIMIT, как:

SELECT RV.duration, 
    P.expirytime 
FROM rid_purchase_info_v64 AS P 
    INNER JOIN rid_video_asset_movievod AS RV 
      ON RV.rid = P.rid 
WHERE RV.rid = 31041 
LIMIT 1 

Или, если вы хотите, чтобы получить наибольшее значение, которое вы могли бы использовать агрегатную функцию MAX():

SELECT MAX(RV.duration), 
    P.expirytime 
FROM rid_purchase_info_v64 AS P 
INNER JOIN rid_video_asset_movievod AS RV 
      ON RV.rid = P.rid 
WHERE RV.rid = 31041 
GROUP BY P.expirytime 

Или наименьшее значение MIN():

SELECT MIN(RV.duration), 
    P.expirytime 
FROM rid_purchase_info_v64 AS P 
INNER JOIN rid_video_asset_movievod AS RV 
      ON RV.rid = P.rid 
WHERE RV.rid = 31041 
GROUP BY P.expirytime 
+0

... пока это приведет только к одной строке, это может только замаскировать более глубокую проблему. В зависимости от данных в таблицах и предполагаемого использования запроса это может обелить что-то, что должно быть нарушено. –

+0

Для 'LIMIT 1' вы правы @ Clockwork-Muse. Но для 'MAX()' или 'MIN()', если он хочет найти только самое высокое или низкое значение соответственно, это не будет проблемой. – Edper

+0

Нет, я рассчитываю 'MAX()' и 'MIN()' (и все другие функции агрегата) в одной лодке. Если он должен получить только один результат, период, они все равно могут маскировать проблему. Это сильно зависит от того, что пытается выполнить ОП, поэтому оно может быть действительным; однако слепое использование этих функций для «дедупликации», скорее всего, вызовет некоторые неожиданности в будущем. –

Смежные вопросы