[英]Running multiple queries in MySQL without using sub-query
我有两个表,一个叫做users
表,
fsname
emailaddress
和第二个表调用了emailaddress
, score
和datetime
attempts
。
现在我想要做的是首先按datetime
排序attempts
表,然后选择然后加入带有users
表的attempt
表,如果它们具有相同的emailaddress
,然后选择每个唯一用户的最终尝试。
简而言之,我必须通过加入这些表来选择每个用户的最后一次尝试,这是我为实现此目的而生成的查询,
$query = "SELECT
distinct users.fsname, users.emailaddress, attempts.score
FROM users
INNER JOIN attempts
ON users.emailaddress = attempts.emailaddress
ORDER BY datetime DESC";
此查询首先假设按datetime
对attempts
进行排序,并且仅选择具有不同名字的值,即fsname
over here。
但是当我执行上面的查询时,它返回的结果具有非唯一的fsname
值,尽管我正在使用带有fsname
DISTINCT
。
任何人都可以告诉我为什么DISTINCT
不工作只选择不同的fsname
?
我已经尝试了DISTINCT fsname
和DISTINCT(fsname)
但这些都没有用。
它不会像您认为的那样工作, 文档解释了DISTINCT
的含义:它是关于不同的行 :
ALL
和DISTINCT
选项指定是否应返回重复的行。ALL
(默认值)指定应返回所有匹配的行,包括重复行。DISTINCT
指定从结果集中删除重复的行。 指定两个选项都是错误的。DISTINCTROW
是同义词DISTINCT
。
(来源: http : //dev.mysql.com/doc/refman/5.7/en/select.html )
您需要按用户对行进行分组,以便为每个用户获取一行,但遗憾的是,您无法通过这种方式获得最新的分数。 您可以获得最大值,最小值,平均值和其他计算值。 检查GROUP BY
聚合函数列表。
这是获取所需值的查询:
SELECT u.fsname, u.emailaddress, la.score
FROM users u
INNER JOIN attempts la # 'la' from 'last attempt'
ON u.emailaddress = la.emailaddress
LEFT JOIN attempts mr # 'mr' from 'more recent' (than last attempt)
ON la.emailaddress = mr.emailaddress AND la.datetime < mr.datetime
WHERE mr.datetime IS NULL
它使用emailaddress
作为匹配列,将表users
(别名为u
)与表attempts
(别名为la
,“最后一次尝试”的缩写)连接起来。 这是你在查询中已经拥有的连接,我添加了别名,因为它们可以帮助你减少从那一点开始写的内容。
接下来,加入attempts
再次表(别名为mr
从“比上一次尝试更近 ”)。 它匹配来自la
每次尝试以及来自同一用户的mr
(由他们的emailaddress
标识)的所有尝试并且具有更新的datetime
。 LEFT JOIN
确保la
中的每一行与mr
至少一行匹配。 la
中没有匹配的行是mr
是每个emailaddress
具有最大datetime
值的行。 它们与满NULL
行匹配(对于mr
部分)。
最后, WHERE
子句仅保留从mr
选择的行的datetime
列中具有NULL
的行。 这些是与emailaddress
每个值匹配la
最新条目的行。
为了快速运行此查询( 任何查询! )需要在JOIN
, WHERE
, GROUP BY
和ORDER BY
子句中使用的列上的索引。
您不应在表attempts
使用emailaddress
来识别用户。 您应该在表users
使用PK
(主键),并在表attempts
(以及引用用户的其他表)中将其用作FK
(外键)。 如果emailaddress
是表的users
PK
,则将其更改为UNIQUE INDEX
并使用新的INTEGER AUTO INCREMENT
ed列userId
作为PK
。 数字列上的索引比字符串列上的索引更快,占用的空间更少。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.