0

我有下表

id  blocked  blocker
1     2        1
2     4        2
3     xx       xx
4     xx       xx

假设我提供一个 id 2

1-我想执行一个查询,其中将输出第一个和第二个结果。

我正在使用以下查询

$statement = $conn->prepare('SELECT * FROM blocks WHERE blocker = :blocker OR blocked=:blocked'); 

这行得通吗?

现在一旦我得到这些条目的数组

$row = $statement->fetchAll(PDO::FETCH_ASSOC)

注意:它必须得到所有行,因为我需要它们的替代值,即上面示例中的 1 和 4。

其次使用上面的结果,我有另一个表用户。我想执行一个查询,它将输出除 1 和 4 之外的所有条目(参考上表)

id  username  password etc
1
2
3
4

如何在不使用太多服务器资源的情况下执行这两个查询。

4

1 回答 1

0

您的第一个查询是错误的...您需要使用OR而不是AND返回 1 和 2。

SELECT * FROM blocks WHERE blocker = :blocker OR 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

如果您实际上不是在谁被谁阻止之后,那么您甚至不需要选择块数据,您可以对用户进行分组或区分,因此您只能获得每个用户的一个实例:

 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    *******  **
于 2013-03-06T15:57:37.860 回答