2013-12-05 6 views
2

У меня, похоже, проблема с подзапросом во внутреннем соединении, которое не делает, что бы я делал.SubQuery in INNER JOIN (MySQL)

  • Сервер: Localhost через сокет UNIX
  • Программное обеспечение: MySQL версии
  • Программное обеспечение: 5.5.32-nmm2-журнал - (Ubuntu)
  • Database версия клиента: libmysql - 5.5.32

Существует табличная конструкция m: n с 3 таблицами, из которых только 2 относятся к проблеме.

  • Первый из них представляет собой таблицу, которая содержит актеров, идентификатор: CAID.
  • второго является кросс-таблица связывает актер в кино (актер ID: CAID, кино: ID)

Когда я создаю полный внутреннее соединение, как это:

SELECT count(*) AS Count, lastname, firstname 
FROM DVDPROFILER_dvd_common_actor 
INNER JOIN DVDPROFILER_dvd_actor ON DVDPROFILER_dvd_common_actor.caid = DVDPROFILER_dvd_actor.caid 
WHERE DVDPROFILER_dvd_actor.caid > 0 
GROUP BY DVDPROFILER_dvd_actor.caid 
ORDER BY Count DESC 

Я получаю именно то, что ожидаю: Лучшие актеры подсчитаны по тому времени, когда он зачисляется в любом фильме, даже если это несколько раз для нескольких ролей.

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

SELECT count(*) AS Count, lastname, firstname 
FROM DVDPROFILER_dvd_common_actor 
INNER JOIN 
    (SELECT caid 
    FROM DVDPROFILER_dvd_actor 
    GROUP BY id) AS DVDPROFILER_dvd_actor 
ON DVDPROFILER_dvd_common_actor.caid = DVDPROFILER_dvd_actor.caid 
WHERE DVDPROFILER_dvd_actor.caid > 0 
GROUP BY DVDPROFILER_dvd_actor.caid 
ORDER BY Count DESC 

Но результаты, где полностью некорректный

Так что я проверил подзапрос с выбранным актером

SELECT caid, id 
FROM DVDPROFILER_dvd_actor 
WHERE caid = 30801 
GROUP BY id 

И получил именно то, что я ожидал

Итак, я немного поиграл, и когда я представил предложение LIMIT в подзапрос, я неожиданно получил разные, но не правильные ответы.

SELECT count(*) AS Count, lastname, firstname 
FROM DVDPROFILER_dvd_common_actor 
INNER JOIN 
    (SELECT caid 
    FROM DVDPROFILER_dvd_actor 
    GROUP BY id 
    LIMIT 0 , 50000) AS DVDPROFILER_dvd_actor 
ON DVDPROFILER_dvd_common_actor.caid = DVDPROFILER_dvd_actor.caid 
WHERE DVDPROFILER_dvd_actor.caid > 0 
GROUP BY DVDPROFILER_dvd_actor.caid 
ORDER BY Count DESC 

С разными пределами я получил разные результаты, но в каком-то момент, когда я иду в течение определенного предела, то результат будет точно так, как это не предел - но в равной степени неправильно.

Что я здесь просматриваю? :-(

ответ

6

могли бы вы попробовать это? Я думаю, COUNT(DISTINCT DVDPROFILER_dvd_actor.id) полезно для вас.

SELECT lastname, firstname, COUNT(DISTINCT DVDPROFILER_dvd_actor.id) AS Count 
FROM DVDPROFILER_dvd_common_actor 
INNER JOIN DVDPROFILER_dvd_actor ON DVDPROFILER_dvd_common_actor.caid = DVDPROFILER_dvd_actor.caid 
WHERE DVDPROFILER_dvd_actor.caid > 0 
GROUP BY lastname, firstname 
ORDER BY Count DESC 

Если нет, то мы очень рады, когда вы размещаете свои данные и схемы на http://www.sqlfiddle.com/., Что делает нас легче проверить

Благодаря

+0

Это на самом деле работает:. -o Спасибо!:) –

+0

Не стесняйтесь повышать его, тоже :) – fancyPants

+0

@fancyPants Спасибо всем вам ;-) –