2013-03-06 34 views
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) 

注:因为我需要在上面的例子中的可选值为I-E 1和4,必须获得所有的行。

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

id username password etc 
1 
2 
3 
4 

我怎么能执行这两个查询,而无需使用过多的服务器资源。

回答

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 

如果youre被封锁实际上并不之后,其通过谁,那么你甚至需要选择数据块的数据,你可以组合或不同的用户,这样你只能得到每一个实例:

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 ******* ** 
+0

我编辑了第一个查询:)我认为一个是正确的,但我更关心第二个查询。 – 2013-03-06 15:59:07

+0

你是否真的需要'blocks'中的数据,除了从'users'中选择所需的数据? – prodigitalson 2013-03-06 16:50:40

+0

不,我只需要块的数据来获得所有ID的数组 – 2013-03-06 17:00:29