在MySQL中运行多个查询而不使用子查询

时间:2015-05-21 17:34:55

标签: php mysql greatest-n-per-group

我有两张桌子, 一个名为users的表格,

fsname
emailaddress

和第二个名为attempts的表格emailaddressscoredatetime

现在我想要做的是先按attemptsdatetime表进行排序,然后选择attempt表加users表,如果它们有emailaddress$query = "SELECT distinct users.fsname, users.emailaddress, attempts.score FROM users INNER JOIN attempts ON users.emailaddress = attempts.emailaddress ORDER BY datetime DESC"; 1}}然后选择每个唯一用户的最终尝试次数。

简而言之,我必须通过加入这些表来选择每个用户的最后一次尝试,这是我为实现此目的而生成的查询,

attempts

此查询首先假设按datetime排序fsname,并且仅选择具有不同名字fsname的值。

但是当我执行上面的查询时,它返回的结果是DISTINCT的非唯一值,尽管我使用的是fsname DISTINCT

任何人都可以告诉我为什么fsname无法选择不同的DISTINCT fsname

我已经尝试了DISTINCT(fsname)<!doctype html> <html> <title>Macht IT Solutions</title> <head> <style> #body1 { position: relative; background-Color: white; font-color: white; width: 1000px; margin: 0 auto; z-index: -1; } #body2 { position: absolute; top: 140px; font-color: white; width: 1000px; height: 1000px; margin: 0 auto; z-index: 0; } #background { opacity: 0.8; position: absolute; top: 0px; background-image: url("back.jpg"); font-color: white; width: 1000px; height: 1000px; margin: 0 auto; z-index: 1; -webkit-animation-name: bodyback; -webkit-animation-duration: 30s; -webkit-animation-iteration-count: infinite; animation-name: bodyback; animation-duration: 30s; animation-delay: 5s; -webkit-animation-delay: 5s; animation-iteration-count: infinite; animation-timing-function: ease-in; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } #logo { border: 1px solid black; background-color: black; color: white; padding: 5px; border-radius: 5px 0px 5px 0px; background-image: url("networking.jpg"); background-repeat: no-repeat; background-size: cover; background-position: center; height: 130px; } #about { position: absolute; top: 10px; color: black; border: 1px solid blue; background-color: white; border-radius: 5px 0px 5px 5px; padding: 4px; width: 500px; z-index: 2; } #aboutmetext { position: absolute; top: 100px; background-color: white; color: black; float: left; width: 500px; border: 1px solid blue; padding: 4px; border-radius: 5px 30px 20px 20px; z-index: 2; } #video { position: absolute; top: 30px; left: 550px; border: 1px solid blue; background-color: white; float: right; overflow: hidden; border-radius: 10px 10px 0px 0px; height: 360px; z-index: 2; } #serv { position: absolute; top: 400px; float: left; width: 500px; border: 1px solid blue; padding: 4px; border-radius: 5px 30px 20px 20px; color: black; background-color: white; z-index: 2; } #services { position: absolute; top: 300px; font-color: black; float: left; height: 30px; border: 1px solid blue; padding: 4px; background-color: white; border-radius: 5px 0px 5px 0px; color: black; width: 500px; z-index: 2; } #contactus { position: absolute; top: 550px; float: left; height: 30px; border: 1px solid blue; padding: 4px; background-color: white; border-radius: 5px 0px 5px 0px; color: black; z-index: 2; } #contact { position: absolute; top: 650px; float: left; width: 500px; border: 1px solid blue; padding: 4px; border-radius: 5px 30px 20px 20px; color: black; background-color: white; z-index: 2; } @KeyFrames bodyback { 0% { background-image: url("back.jpg"); } 25% { background-image: url("net1.jpg"); } 50% { background-image: url("net2.jpg"); } 100% { background-image: url("net3.jpg"); } } @-webkit-keyframes bodyback { 0% { background-image: url("back.jpg"); } 25% { background-image: url("net1.jpg"); } 50% { background-image: url("net2.jpg"); } 100% { background-image: url("net3.jpg"); } } @KeyFrames { } @KeyFrames { } @KeyFrames { } </style> </head> <body id="body1"> <div id="logo" style="font-size:30px"> <img src="machtlogo1.png" height="100" width="100"> Macht IT Solutions </div> <div id="body2"> <div id="background"></div> <h1 id="about">About us</h1> <div> <p id="aboutmetext"> <font> </font> </p> <div id="video"> <p align="center"> <font color="black"> <b> What is the Internet? </b> </font> </p> <iframe width="420" height="315" src="https://www.youtube.com/embed/Jj6EHgSsx_U?autoplay=0"> </iframe> </div> </div> <div> <h1 id="services"><font color="black">Services</font></h1> </div> <div id="serv"> <p> <font color="black"> inquiry. </font> </p> </div> <div> <h1 id="contactus"><font color="black">Contact us</font></h1> </div> <div id="contact"> <p> <font color="black"> </font> </p> </div> </div> </body> </html> ,但这些都没有效果。

1 个答案:

答案 0 :(得分:3)

它并不像您认为的那样有效,documentation解释了@Transactional(rollbackFor=Exception.class) 的含义:它关于不同的

  

DISTINCTALL选项指定是否应返回重复的行。 DISTINCT(默认值)指定应返回所有匹配的行,包括重复行。 ALL指定从结果集中删除重复的行。指定两个选项都是错误的。 DISTINCTDISTINCTROW的同义词。

(来源:http://dev.mysql.com/doc/refman/5.7/en/select.html

您需要按用户对行进行分组,以便为​​每个用户获取一行,但遗憾的是,您无法以这种方式获取最新分数。 您可以获得最大值,最小值,平均值和其他计算值。查看GROUP BY aggregate functions

列表

查询

这是获取所需值的查询:

DISTINCT

如何运作

它将表格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 (别名为users)与表格u(别名为attempts,&#34;缩写为#34;最后一次尝试&#34;)联接{ {1}}作为匹配列。这是您在查询中已经拥有的联接,我添加了别名,因为它们可以帮助您从该点开始减少写入。

接下来,它再次加入la表格(别名为emailaddress来自&#34; 比最近一次尝试更多&#34;)。它匹配来自attempts的所有尝试与同一用户的mr的所有尝试(由la 确定的更新{{1} }}。 mr确保emailaddress中的每一行与datetime中的至少一行匹配。来自LEFT JOIN的{​​{1}}中没有匹配项的行是每个la的最大值为mr的行。它们与满la的行匹配(mr部分)。

最后,datetime子句仅保留从emailaddress中选择的行的NULL列中mr行的行。对于WHERE的每个值,这些行与NULL的最新条目匹配。

表现评论

为了快速运行此查询(任何查询!)需要对datetimemrla和{{中使用的列进行索引1}}条款。

您不应使用表emailaddress中的JOIN来识别用户。您应该在表WHERE上使用GROUP BY(主键)并将其用作表ORDER BY中的emailaddress(外键)(以及引用用户的其他表) )。如果attempts是表PK的{​​{1}},则将其更改为users并使用新的FK ed列attempts作为emailaddress而是。数字列上的索引比字符串列上的索引更快,占用的空间更少。