Mysql循环遍历行以检查行,直到找到计数为零的行

时间:2017-04-18 19:31:17

标签: php mysql while-loop

我通过许多类似的解决方案,但找不到符合我要求的解决方案。

我想限制用户在24小时内每个网址创建两个以上的shortURL

人们正在滥用这个并创建10个以上的网址并堵塞我的数据库。所以我想将它们限制为每个网址2,并留下一条消息,如果它们超过了

现在我有这个检查,看看他们每个网址完成了多少次

    $sql = "SELECT * FROM ShortUrls WHERE user_id='$user' AND vidID='$urlMe' AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))";
    $result = $conn->query($sql);

   echo "user created this many urls: " .$result->num_rows;
   if ($result->num_rows > 2) {
         // keep checking till find one less that 2
     }

循环访问网址数据库并检查他们是否在24小时内使用了相同的网址超过两次。如果他们在24小时内没有使用该网址超过两次,他们可以使用该网址创建一个新的缩短网址。

编辑我使用的解决方案:

$sql2 = "SELECT tube.vidID FROM tube LEFT JOIN ( SELECT COUNT(*) c, vidID FROM ShortUrls WHERE user_id='$user' AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY)) GROUP BY vidID ) urls ON urls.vidID = tube.vidID WHERE urls.c < 2 LIMIT 1;";
$result = $conn->query($sql2);

if ($row = $result->fetch_assoc()) { 
  echo "You can add a URL to this video: " . htmlspecialchars($row['vidID']); 
} else { 
  echo "All videos used up!"; 
}

希望这对其他人有用

1 个答案:

答案 0 :(得分:1)

是否要查看哪些user_id在过去24小时内创建的行数少于两行SELECT COUNT(*) c, vidID FROM ShortUrls WHERE user_id = ? AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY)) GROUP BY vidID HAVING c < 2

vidID

但如果您提前知道vidID,并且您只关注那个SELECT COUNT(*) FROM ShortUrls WHERE user_id = ? AND vidID = ? AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))

vidID

如果您想为任何 SELECT COUNT(*) c, vidID FROM ShortUrls WHERE user_id = ? AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY)) GROUP BY vidID HAVING c > 2 创建两个以上的人来阻止他们,请尝试以下操作:

vidID

如果查询返回任何内容,则用户在过去24小时内为单个SELECT COUNT(*) FROM ( SELECT COUNT(*) c, vidID FROM ShortUrls WHERE user_id = ? AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY)) GROUP BY vidID HAVING c > 2 ) i 创建的内容超过2个。

如果你想获得幻想:

{{1}}