2013-03-06 64 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