从MySQL中的多个表中进行选择时,以下两个查询都返回相同的结果集.
其中一个查询比另一个查询更好还是更有效?从我对小数据集的测试(每个表中约2k行),它们都在大约相同的执行时间内返回相同的结果集.
查询1:
SELECT
*
FROM
products,
product_meta,
sales_rights
WHERE
(
products.id = product_meta.product_id
AND products.id = sales_rights.product_id
)
AND (...)
LIMIT 0,10;
Run Code Online (Sandbox Code Playgroud)
查询2:
SELECT
*
FROM
products
INNER JOIN product_meta ON products.id = product_meta.product_id
JOIN sales_rights ON product_meta.product_id = sales_rights.product_id
WHERE
(...)
LIMIT 0,10;
Run Code Online (Sandbox Code Playgroud) 我正在为我们的网站构建一个活动流,并且已经取得了相当不错的进展.
它由两个表提供支持:
流:
id - 唯一的流项目IDuser_id - 创建流项目的用户的IDobject_type - 对象类型(当前为'卖方'或'产品')object_id - 对象的内部ID(当前是卖家ID或产品ID)action_name - 针对对象采取的行动(目前是'买'或'心')stream_date - 创建操作的时间戳.hidden - 用户是否已选择隐藏项目的布尔值.如下:
id - 独特的关注IDuser_id - 启动"关注"操作的用户的ID.following_user - 正在关注的用户的ID.followed - 执行跟随操作的时间戳.目前我正在使用以下查询从数据库中提取内容:
查询:
SELECT stream.*,
COUNT(stream.id) AS rows_in_group,
GROUP_CONCAT(stream.id) AS in_collection
FROM stream
INNER JOIN follows ON stream.user_id = follows.following_user
WHERE follows.user_id = '1'
AND stream.hidden = '0'
GROUP BY stream.user_id,
stream.action_name,
stream.object_type,
date(stream.stream_date)
ORDER BY stream.stream_date DESC;
Run Code Online (Sandbox Code Playgroud)
这个查询实际上运行得很好,并且使用一点点PHP来解析MySQL返回的数据我们可以创建一个很好的活动流,如果行为之间的时间不是太大,同一个用户被分组在一起的行为相同(见下面的例子).

我的问题是,我如何让这更聪明?目前,它通过一个轴"用户"活动进行分组,当特定用户在特定时间范围内有多个项目时,MySQL知道将它们分组.
我怎样才能使这个更智能,并按另一个轴分组,例如"object_id",所以如果同一个对象按顺序有多个动作,则这些项被分组,但保持我们当前用于按用户分组动作/对象的分组逻辑.并实现这一点,没有数据重复?
按顺序出现的多个对象的示例: …