繁体   English   中英

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

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

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

我正在记录songID,对该歌曲的评级以及对该歌曲进行投票的用户ID。

我想做的是防止用户对某首歌“已经”投票时对其进行投票。 因此,我需要能够在插入之前检查表中是否存在一行。

所以...如果userID = 1,songID = 1,等级=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";
    }
  }
}

当然,还有其他实现此类事情的方式(例如存储过程)。

将以下WHERE子句添加到您的sql语句中

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

可以在Oracle和SQL Server上运行...对MySQL不确定

如何使用REPLACE查询呢? REPLACE查询将替换具有相同主键(或唯一键)且没有错误的旧查询。 我认为某些用户可能想更新他们的投票。

我会更改加载方式的视图,方法是在当前用户已经为歌曲投票后不允许“投票”,或者如果您想让他们更改评分,请更新该内容,而不是在同一用户中对该用户进行插入歌曲..

如果已定义该表,使得(songid,userid)对于每个记录都必须是唯一的(通过将这对定义为键),则如果用户尝试对同一首歌曲进行重新投票,则插入将失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM