我有以下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条结果将是具有相同ID的相同记录!
我无法看到查询的任何明显问题,因此不确定导致此问题的原因。
答案 0 :(得分: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
有服务器ID,那么您可能需要:
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
答案 1 :(得分:0)
您正在加入两个表(files
和servers
),但我看不到任何限制服务器的内容,因此它会重复{{{}的每个匹配行1}}与files
的每个匹配行(我认为所有这些都是。)
答案 2 :(得分:0)
我想,
首先,您应该在where语句中为files.server_id = servers.id
等表添加连接条件。
其次,您应该将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
我希望,它有效。