Php mysql-一个更复杂的查询或两个简单的查询

Php mysql-一个更复杂的查询或两个简单的查询,php,mysql,sql,Php,Mysql,Sql,我想知道哪个查询更好。我想选择表中的一些特定记录和所有记录计数(但已筛选) 哪个查询更好 SELECT name, surname, (select COUNT(messages.id) from messages WHERE `messages`.`archived` = '0' AND `type` IN (0, 1) ) as count FROM messages JOIN users ON users.id = messages.user_id W

我想知道哪个查询更好。我想选择表中的一些特定记录和所有记录计数(但已筛选)

哪个查询更好

SELECT name, surname,
        (select COUNT(messages.id) from messages WHERE `messages`.`archived` = '0' AND `type` IN (0, 1) ) as count
FROM messages JOIN
     users
      ON users.id = messages.user_id
WHERE messages.archived = 0 AND type = 0 OR type = 1
ORDER BY created_on DESC
LIMIT 3

如果我有大数据库,我会检查这个,但现在我有一些记录

通过单个查询,计数将添加到每个记录中


谢谢,对不起我的英语

写了这篇文章后,我意识到这两个查询是不同的。因此,您应该使用与您想要得到的结果相对应的版本。(是否要筛选计数?)

我不确定MySQL是否会在
SELECT
中优化子查询。但是,您可以将其移动到
FROM
子句中,在该子句中它只运行一次:

SELECT `name`, `surname`, m.cnt
FROM `messages` JOIN
     `users`
      ON `users`.`id` = `messages`.`user_id` CROSS JOIN
      (select COUNT(messages.id) as cnt from messages) m
WHERE `messages`.`archived` = '0' AND `type` = 0 OR `type` = 1
ORDER BY `created_on` DESC;
LIMIT 3
我怀疑你的
WHERE
子句不正确。你真的打算这样做吗

WHERE `messages`.`archived` = '0' AND `type` IN (0, 1)

... 或者至少
WHERE messages.archived=0和(type=0或type=1)
对不起,我的错误。我想在(0,1)中查询
邮件
存档的
='0'和
类型
的邮件数,因此我的第一个更复杂的查询是错误的。@Ridd。然后您可以将这些条件放在子查询中的
FROM
子句中。@GordonLinoff我添加了类似“…FROM messages where messages.type=sleep(1))m…”的内容,现在我看到mysql每次都会计算子查询的数量,所以也许我应该使用两个简单查询,而不是一个复杂查询?感谢您的回复。这两种方法计算的结果并不相同:在第一次查询中,您计算表中的所有消息,在第二次查询中,您只计算符合条件的消息。也许您应该用文字描述您希望查询实现的目标,因为您发布的这些示例不会与@Xebax做相同的事情这么说很难知道如何回答,尽管会有人试图猜测对不起,我错了。我想在(0,1)中查询
消息
存档的
='0'和
类型
的消息计数,因此第一个更复杂的查询是错误的。
SELECT `name`, `surname`, m.cnt
FROM `messages` JOIN
     `users`
      ON `users`.`id` = `messages`.`user_id` CROSS JOIN
      (select COUNT(messages.id) as cnt from messages) m
WHERE `messages`.`archived` = '0' AND `type` = 0 OR `type` = 1
ORDER BY `created_on` DESC;
LIMIT 3
WHERE `messages`.`archived` = '0' AND `type` IN (0, 1)