我有两张桌子,
一个名为users
的表格,
fsname
emailaddress
和第二个名为attempts
的表格emailaddress
,score
和datetime
。
现在我想要做的是先按attempts
对datetime
表进行排序,然后选择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>
,但这些都没有效果。
答案 0 :(得分:3)
它并不像您认为的那样有效,documentation解释了@Transactional(rollbackFor=Exception.class)
的含义:它关于不同的行:
DISTINCT
和ALL
选项指定是否应返回重复的行。DISTINCT
(默认值)指定应返回所有匹配的行,包括重复行。ALL
指定从结果集中删除重复的行。指定两个选项都是错误的。DISTINCT
是DISTINCTROW
的同义词。
(来源: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
的最新条目匹配。
为了快速运行此查询(任何查询!)需要对datetime
,mr
,la
和{{中使用的列进行索引1}}条款。
您不应使用表emailaddress
中的JOIN
来识别用户。您应该在表WHERE
上使用GROUP BY
(主键)并将其用作表ORDER BY
中的emailaddress
(外键)(以及引用用户的其他表) )。如果attempts
是表PK
的{{1}},则将其更改为users
并使用新的FK
ed列attempts
作为emailaddress
而是。数字列上的索引比字符串列上的索引更快,占用的空间更少。