поисковый запрос mysql возвращает одну и ту же запись x раз

#mysql

#mysql

Вопрос:

У меня есть следующий запрос mysql

 SELECT *, DATE(file_created) as created, s.disk_id, s.url, 
(SELECT COUNT(*) FROM Comments WHERE cmt_type=1 AND file_id=cmt_id) as comments FROM (files, servers s)
 WHERE usr_id=1 AND (file_name LIKE CONCAT('%','sample','%') OR file_descr LIKE CONCAT('%','sample','%')) 
ORDER BY file_created DESC
  

Когда я запускаю этот запрос, я получаю 40 записей обратно, если есть хотя бы одна запись, соответствующая запросу, и все 40 результатов будут одной и той же записью с тем же идентификатором!

Я не вижу никаких очевидных проблем с запросом, поэтому не уверен, что вызывает эту проблему.

Ответ №1:

Вот ваш запрос, отформатированный для лучшего понимания:

 SELECT *, DATE(file_created) as created, s.disk_id, s.url, 
       (SELECT COUNT(*) FROM Comments WHERE cmt_type=1 AND file_id=cmt_id) as comments
FROM files, servers s
WHERE usr_id = 1 AND
      (file_name LIKE CONCAT('%','sample','%') OR file_descr LIKE CONCAT('%','sample','%')) 
ORDER BY file_created DESC
  

У вас нет join условия между files и server . Неудивительно, что вы получаете дубликаты. Запятая в from предложении означает cross join или «создать декартово произведение». Просто не используйте запятые в from предложении. Простое правило, которое избавит от будущих разочарований.

Итак, если file у него есть идентификатор сервера, тогда вы можете захотеть:

 SELECT *, DATE(file_created) as created, s.disk_id, s.url, 
       (SELECT COUNT(*) FROM Comments WHERE cmt_type=1 AND file_id=cmt_id) as comments
FROM files JOIN
     servers s
     ON files.serverid = s.serverid
WHERE usr_id = 1 AND
      (file_name LIKE CONCAT('%','sample','%') OR file_descr LIKE CONCAT('%','sample','%')) 
ORDER BY file_created DESC
  

Ответ №2:

Вы соединяете две таблицы ( files и servers ), но я не вижу ничего, что могло бы ограничить серверы, поэтому он будет повторять каждую соответствующую строку files с каждой соответствующей строкой servers (я полагаю, все из них).

Ответ №3:

Я думаю,

Во-первых, вы должны добавить критерии объединения для таблиц, как files.server_id = servers.id в операторе where .

Во-вторых, вы должны изменить file_id=cmt_id оператор на comments.file_id = file_id для правильного подсчета.

 SELECT *, DATE(file_created) as created, s.disk_id, s.url, (SELECT COUNT(*) FROM Comments WHERE cmt_type=1 AND Comments.file_id = files.file_id) as comments
FROM (files, servers s)
WHERE files.file_server_id = s.server_id AND usr_id=1 AND (file_name LIKE CONCAT('%','sample','%') OR file_descr LIKE CONCAT('%','sample','%')) 
ORDER BY file_created DESC
  

Надеюсь, это сработает.

Комментарии:

1. Можете ли вы показать OP, как будет выглядеть полный запрос?

2. можете ли вы прислать мне имена столбцов файлов и серверов?