У меня, похоже, проблема с подзапросом во внутреннем соединении, которое не делает, что бы я делал.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
С разными пределами я получил разные результаты, но в каком-то момент, когда я иду в течение определенного предела, то результат будет точно так, как это не предел - но в равной степени неправильно.
Что я здесь просматриваю? :-(
Это на самом деле работает:. -o Спасибо!:) –
Не стесняйтесь повышать его, тоже :) – fancyPants
@fancyPants Спасибо всем вам ;-) –