Php 检索除被阻止查询的用户之外的所有条目
我有下表Php 检索除被阻止查询的用户之外的所有条目,php,Php,我有下表 id blocked blocker 1 2 1 2 4 2 3 xx xx 4 xx xx 假设我提供一个ID2 1-我想执行一个查询,其中第一个和第二个结果都将被输出 我使用下面的查询 $statement = $conn->prepare('SELECT * FROM blocks WHERE blocker = :blocker OR blocked=:blocked'); 这样
id blocked blocker
1 2 1
2 4 2
3 xx xx
4 xx xx
假设我提供一个ID2
1-我想执行一个查询,其中第一个和第二个结果都将被输出
我使用下面的查询
$statement = $conn->prepare('SELECT * FROM blocks WHERE blocker = :blocker OR blocked=:blocked');
这样行吗
现在,一旦我得到了这些条目的数组
$row = $statement->fetchAll(PDO::FETCH_ASSOC)
注意:它必须得到所有行,因为在上面的示例中,我需要它们的可选值I-e1和4
其次,利用以上结果,我得到了另一个表用户。我想执行一个查询,该查询将得到除1和4(参考上表)之外的所有条目
id username password etc
1
2
3
4
如何在不占用大量服务器资源的情况下执行这两个查询。您的第一个查询是错误的。。。您需要使用
或
而不是和
来返回1和2
从blocker=:blocker或blocked=:blocked的块中选择*
现在,您可以使用联接在单个查询中获得所需的所有数据:
SELECT u.*, b.* FROM blocks b, users u
WHERE (
b.blocker = :blocker OR b.blocked=:blocked
) AND (
u.id = b.blocker
OR u.id = b.blocked
)
请注意,这可能会为您提供与单个用户对应的2行,例如,结果可能是:
id username password etc id blocked blocker
1 user1 ******* ** 1 2 1
2 user2 ******* ** 1 2 1
2 user2 ******* ** 2 4 2
如果您实际上不在who阻止的用户之后,那么您甚至不需要选择blocks数据,您可以对用户进行分组或区分,这样每个用户只会得到一个实例:
SELECT DISTINCT u.* FROM users u, blocks b
WHERE (
b.blocker = :blocker OR b.blocked=:blocked
) AND (
u.id = b.blocker
OR u.id = b.blocked
)
这将产生如下结果:
id username password etc
1 user1 ******* **
2 user2 ******* **
我编辑了第一个查询:)我认为其中一个是正确的,但我对第二个查询更感好奇。除了从
用户中选择所需数据之外,您是否真的需要块中的数据,我只需要块中的数据来获取所有id的数组,但您是否只需要这些id值来查询用户?当我阻止某人时,我的id及其id将保存为阻止程序并被阻止。现在,当我给所有用户打电话时,他不应该看到我,我也不应该看到他。上面的查询为False,而不是返回所有用户列表。