#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. можете ли вы прислать мне имена столбцов файлов и серверов?