如何检查MySQL中是否存在包含某些内容的行


How to check if a row exists which contains certain content in MySQL

我使用下面的代码在我的应用程序中插入特定歌曲的评级。

我正在记录songID,给这首歌的评分和对这首歌投票的userID。

我想做的是防止用户投票,如果他们"已经"投票了某首歌。因此,我需要能够在插入之前检查表中是否存在一行。

所以…userID = 1, songID = 1, rating = 4。

如果随后尝试插入userID=1, songID=1, rating=*,则应该插入失败

然而,如果用户投票给另一首歌…这应该是允许的,插入应该发生。

知道我该怎么做吗?

//Add rating to database
if(!empty($_POST['rating']) && isset($_POST))
{
    //make variables safe to insert
  $rating = mysql_real_escape_string($_POST['rating']);
  $songid = mysql_real_escape_string($_POST['song_id']);
    //query to insert data into table
    $sql = "
        INSERT INTO wp_song_ratings
        SET
        songid = '$songid',
        rating = '$rating',
        userid = '$user_id'";
    $result = mysql_query($sql);
    if(!$result)
    {
        echo "Failed to insert record";
    }
    else
    {
        echo "Record inserted successfully";
    }
}

userIDsongID添加UNIQUE KEY。如果你不希望他们改变他们的评级,你不应该允许它从前端,但仍然在后端进行检查。如果UNIQUE KEY在适当的位置,它将失败。

ALTER TABLE `wp_song_ratings` ADD UNIQUE KEY `user_song_key` (`userID`, `songID`)

听起来您需要在mysql中使用存储过程—更多信息请访问http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

您可以先执行SELECT语句:

if(!empty($_POST['rating']) && isset($_POST))
{
    //make variables safe to insert
  $rating = mysql_real_escape_string($_POST['rating']);
  $songid = mysql_real_escape_string($_POST['song_id']);
  $select_sql = "SELECT COUNT(*) WHERE songid='$songid' AND userid='$user_id'";
  $select_result = mysql_query($select_sql);
  if ( mysql_num_rows($select_result) > 0 )
  {
    /* already voted! */
  }
  else
  {
    //query to insert data into table
    $sql = "
        INSERT INTO wp_song_ratings
        SET
        songid = '$songid',
        rating = '$rating',
        userid = '$user_id'";
    $result = mysql_query($sql);
    if(!$result)
    {
        echo "Failed to insert record";
    }
    else
    {
        echo "Record inserted successfully";
    }
  }
}

当然,也有其他方法可以实现这些事情(比如存储过程)。

在sql语句中添加以下WHERE子句

WHERE NOT EXISTS (SELECT 1 FROM wp_song_ratings WHERE songid= '$songid' and userid = '$user_id')

在Oracle和SQL Server上工作…

如何使用REPLACE查询呢?REPLACE查询将替换具有相同主键(或唯一键)的旧查询,而不会出现错误。我想有些用户可能想更新他们的投票。

我会改变加载这个视图的方式,当当前用户已经为这首歌投票时,不允许'投票',或者如果你想让他们改变评级,做一个更新,而不是为同一首歌的用户插入。

如果表已经定义为(songid,userid)对于每条记录必须是唯一的(通过将此对定义为键),那么如果用户试图对同一首歌重新投票,则插入将失败。