Php MySQL选择变量不在行中的位置

Php MySQL选择变量不在行中的位置,php,mysql,arrays,Php,Mysql,Arrays,我正在尝试使用MySQL查询来提取特定的行,而不需要PHP的帮助 好,, 我想选择一行,其中变量不在特定行中,但问题是 $blocked_user = "aaron"; 在MySQL中 +----------+-----------------------+ | id | blocked | +----------+-----------------------+ | 1 | aaron,john | 我希望在选择和

我正在尝试使用MySQL查询来提取特定的行,而不需要PHP的帮助

好,, 我想选择一行,其中变量不在特定行中,但问题是

$blocked_user = "aaron";
在MySQL中

+----------+-----------------------+
| id       | blocked               |
+----------+-----------------------+
| 1        | aaron,john            |
我希望在选择和处理john时跳过aaron 一个错误的例子:

SELECT * FROM table WHERE $blocked_user NOT IN blocked
我所做的是使用php explode函数获取被阻止的内容并将其分离,然后使用in_数组,如果要确认其不存在:

if(in_array($blocked_user, explode($row['blocked'])){
  exit;
}

但是现在我想摆脱这个问题,用一个查询来完成它,它是如何完成的?

可能有一些高级的regex-MySQL,但是问题更为严重。您的桌子应该看起来更像这样:

| id | blocked |
----------------
| 1  |  aaron  |
| 1  |   john  |
其中,当然id不是主键类型

然后你可以这样做:

SELECT * FROM table WHERE id = 1 AND blocked NOT IN ('aaron')
根据您的编辑,如果您有第二个表,我们将其称为数据


您可能可以使用某种高级regexmysql,但问题更为严重。您的桌子应该看起来更像这样:

| id | blocked |
----------------
| 1  |  aaron  |
| 1  |   john  |
其中,当然id不是主键类型

然后你可以这样做:

SELECT * FROM table WHERE id = 1 AND blocked NOT IN ('aaron')
根据您的编辑,如果您有第二个表,我们将其称为数据

你可以试试

$sql = "SELECT * FROM table WHERE blocked NOT LIKE '%{$blocked_user}%'";
你可以试试

$sql = "SELECT * FROM table WHERE blocked NOT LIKE '%{$blocked_user}%'";

实际上,您应该将每个CSV值放在不同的行中,可能放在一个被阻止的表中,但您可以做的是:

SELECT * 
FROM tbl
WHERE FIND_IN_SET('$blocked_user', blocked) = 0
如果$blocked_用户包含在blocked列的CSV列表中,则不会选择该行


实际上,您应该将每个CSV值放在不同的行中,可能放在一个被阻止的表中,但您可以做的是:

SELECT * 
FROM tbl
WHERE FIND_IN_SET('$blocked_user', blocked) = 0
如果$blocked_用户包含在blocked列的CSV列表中,则不会选择该行


我认为您正在寻找的是一个左外连接,但这需要将被阻止的名称存储在单独的行中

例如:

+----------+-----------------------+
| id       | blocked               |
+----------+-----------------------+
| 1        | aaron                 |
| 2        | john                  |
然后可以在用户表上执行左外部联接,如下所示:

SELECT * FROM users AS u
LEFT JOIN blocked as b
ON b.blocked = u.username
WHERE b.blocked IS NULL

我认为您正在寻找的是一个左外连接,但这需要将被阻止的名称存储在单独的行中

例如:

+----------+-----------------------+
| id       | blocked               |
+----------+-----------------------+
| 1        | aaron                 |
| 2        | john                  |
然后可以在用户表上执行左外部联接,如下所示:

SELECT * FROM users AS u
LEFT JOIN blocked as b
ON b.blocked = u.username
WHERE b.blocked IS NULL

您的阻止字段是否实际存储逗号分隔的值?在db字段中内爆字符串不是一个好主意。您应该将每个用户存储在不同的数据库中row@JorgeZapata不,它实际上是一个会话用户名,但只是显示在example@Osa-您能否在问题中添加一个完整的示例?我很难弄清楚你到底想要什么-你只是想要“亚伦,约翰”字符串中的“约翰”部分吗?@user1538127到那时他们可能已经超过1000了,我做不到,我可以这样做,以防有其他想法做同样的事情,但在一行中,您的阻止字段是否实际存储逗号分隔的值?在db字段中内爆字符串不是一个好主意。您应该将每个用户存储在不同的数据库中row@JorgeZapata不,它实际上是一个会话用户名,但只是显示在example@Osa-您能否在问题中添加一个完整的示例?我很难弄清楚你到底想要什么-你只是想要“亚伦,约翰”字符串中的“约翰”部分吗?@user1538127到那时他们可能已经超过1000了,我做不到,我可以,以防有任何其他想法来做同样的事情,但在一行中,ID 1是一行,我想阻止特定的人aaron选择它,所以你有一个单独的表,你将他们联系起来,对吗?id 1是一行,我想阻止特定的人aaron选择它,所以你有一个单独的表,你将他们联系起来,对吗?