2013-09-10 5 views
1

У меня возникли проблемы со следующим запросом. Для подзапроса, возвращающего сумму итоговых результатов, я получаю сообщение об ошибке Неизвестный столбец 'search.term' в 'where clause', я не уверен, как я смогу сделать этот запрос правильно? Любая помощь приветствуется.Как получить доступ к столбцу в подзапросе?

SELECT *, 
    (SELECT SUM(totalResults) 
    FROM (SELECT COUNT(*) as totalResults 
     FROM media 
     LEFT JOIN users ON users.id = media.userId 
     WHERE media.title LIKE CONCAT('%', search.term, '%') 
     OR media.description LIKE CONCAT('%', search.term, '%') 
     OR media.tags LIKE CONCAT('%', search.term, '%') 
     OR users.username LIKE search.term 
     UNION ALL 
     SELECT COUNT(*) 
     FROM reposts 
     LEFT JOIN media ON media.id = reposts.mediaId 
     LEFT JOIN users ON users.id = reposts.userId 
     WHERE media.title LIKE CONCAT('%', search.term, '%') 
     OR media.description LIKE CONCAT('%', search.term, '%') 
     OR media.tags LIKE CONCAT('%', search.term, '%') 
     OR users.username LIKE search.term 
     ) 
    t) AS totalResults, 
    MAX(search.timestamp) AS searchTimestamp 
    FROM search 
    WHERE userId = '1' 
    GROUP BY search.term 
    ORDER BY searchTimestamp DESC 
+0

Насколько велики подсчеты? –

+0

Их сумма равна 9 (8, 1), это фактически реализация последнего запроса, на который вы ответили. –

+0

Есть ли столбец, называемый термином в таблице поиска? –

ответ

2

Причина заключается в вложенных вложенных SELECT подзапросах. Попробуйте это:

SELECT term, 
     (SELECT COUNT(*) 
      FROM media 
      LEFT JOIN users ON users.id = media.userId 
      WHERE media.title LIKE CONCAT('%', search.term, '%') 
       OR media.description LIKE CONCAT('%', search.term, '%') 
       OR media.tags LIKE CONCAT('%', search.term, '%') 
       OR users.username LIKE search.term 
     ) 
     + 
     (SELECT COUNT(*) 
      FROM reposts 
      LEFT JOIN media ON media.id = reposts.mediaId 
      LEFT JOIN users ON users.id = reposts.userId 
      WHERE media.title LIKE CONCAT('%', search.term, '%') 
       OR media.description LIKE CONCAT('%', search.term, '%') 
       OR media.tags LIKE CONCAT('%', search.term, '%') 
       OR users.username LIKE search.term 
     ) AS totalResults, 
     MAX(timestamp) AS searchTimestamp 
FROM search 
WHERE userId = '1' 
GROUP BY term 
ORDER BY searchTimestamp DESC ; 

Sidenote: Использование SELECT *, имея GROUP BY <columns> даст вам неопределенные результаты во всех других колонках, кроме <columns>. MySQL допускает такое плохо определенное поведение, но это не очень хорошая практика.

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