检查默认的用户选项

时间:2012-02-27 20:59:22

标签: php mysql

我有桌子:

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,而不仅仅是一个

5 个答案:

答案 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 />';
    }
}