我有桌子:
user_id | song_id| points
--------|----------------
2 | 1 | 0
2 | 2 | 1
2 | 3 | 2
2 | 4 | 3
2 | 5 | 4
我需要检查用户是否更改了分值。 因此它应该是这样的:
while ($row = mysql_fetch_array($query)) {
$userID = $row['user_id'];
$songID = $row['song_id'];
$points = $row['points'];
if($songID-$points==1){
echo $userID."<br>";
}
但是这将打印出用户ID的每个场合的 ,其中song-id - points = 1.
我只需要打印出所有值为1的user_id,并且用户名必须只回显一次。
修改
SELECT DISTINCT user_id WHERE (song_id - points) = 1
这是一半。这个echo的user_ids'中的song_id - points = 1,但是如果用户被重新排序(我使用jQuery sortable)列表,那么可能会有一些行是“song_id - points = 1”。
我的脚本必须只回显这些user_id-s,其中用户每个song_id - points = 1,而不仅仅是一个
答案 0 :(得分:2)
SELECT DISTINCT user_id FROM table WHERE (song_id - points) = 1
编辑后:
SELECT table.user_id
FROM table
LEFT JOIN (
SELECT user_id, COUNT(*) AS C FROM table) AS T2
ON table.user_id = T2.user_id
WHERE (table.song_id - table.points) = 1
GROUP BY table.user_id
HAVING COUNT(*) = T2.C
答案 1 :(得分:1)
您可以先筛选已修改点值的用户:
SELECT DISTINCT user_id FROM table
WHERE (song_id - points) != 1
然后您可以使用获取不符合上述条件的用户:
SELECT DISTINCT user_id FROM table
WHERE user_id NOT IN (
SELECT DISTINCT user_id FROM table
WHERE (song_id - points) != 1
)
根据您上次编辑,最后一条SQL语句可能有效。
您可以查看a working example。
答案 2 :(得分:1)
以下是您要找的内容:
select user_id from (
select user_id, if(song_id - points = 1, 0, 1) flag from t
) as S
group by user_id
having sum(flag) = 0
这是一个有效的example。
如果我不理解这些要求,则会显示所有甚至没有song_id - points != 1
行的用户,即所有行都匹配song_id - points = 1
或许,如果您更喜欢可能更有效的不同方法:
select distinct t1.user_id from t t1
where not exists (
select * from t t2
where t2.song_id - t2.points != 1 and t1.user_id = t2.user_id
)
这是工作example。
答案 3 :(得分:0)
不确定我理解这种情况的原因,但一个简单的控制中断结构将达到预期的效果......
$old_id = '';
$good = false;
while($row = mysql_fetch_array($query)){
//check to see if we have a new user ...
if($row['user_id'] != $old_id){
//check to see if all values were == 1
if($good){
echo $old_id . '<br />';
}
//re-initialize variables
$good = true;
$old_id = $row['user_id'];
}
//if value != 1, we won't print the user ...
if($row['song_id'] - $row['points'] != 1){
$good = false;
}
}
//final end-of-loop condition ...
if($good){
echo $old_id . '<br />';
}
答案 4 :(得分:0)
好的,这是一个比上面的连接简单得多的查询:
SELECT user_id, sum(song_id) as song_total, sum(points) as point_total, count(*) AS cnt FROM table GROUP BY user_id
如果每首歌曲的song_id和points之间的差异为1,那么总数之间的差异将等于该用户的行数...所以使用此查询:
while($row = mysql_fetch_array($query)){
if($row['cnt'] == ($row['song_total'] - $row['point_total'])){
echo $row['user_id'] . '<br />';
}
}