2012-01-26 172 views
4

我對標題感到抱歉,但沒有找到更好的標題。 我的問題如下: 我想選擇表「字段」user「爲」user1「或」user2「的所有字段,我的查詢看起來像這樣,但它返回一個零值:SQL子查詢空返回

SELECT * FROM `log` 
    WHERE `user` = ANY(SELECT `user1` FROM `friendships` 
         WHERE (`user1` = 1 OR `user2` = 1) AND `active` = 1) 
    OR `user` = ANY(SELECT `user2` FROM `friendships` 
        WHERE (`user1` = 1 OR `user2` = 1) AND `active` = 1) 
    GROUP BY `arguments` 
    ORDER BY `created` DESC 

如果我只使用一個子查詢它的工作原理,但我還需要第二場了。而且還有更多的值(這就是爲什麼我用ANY子查詢和不參加的原因)。 我希望有人發現我的錯誤:)

+2

什麼數據庫這是什麼?甲骨文? – DOK

+0

@波希米亞 - 沒有工具,只是普通的老我。我從Quassnoi那裏得到一個格式,然後貼在我身上,但我懷疑它會粘在你身上:)。隨時重新格式化你的喜好。 –

+0

好吧,我會按照我認爲最好的方式進行格式化。當然,您可以按照自己喜歡的方式回滾更改。注意輕微的重構以簡化和刪除不需要的括號 – Bohemian

回答

3

我希望這個作品:

SELECT * 
FROM `log` INNER JOIN `friendships` on 
    `log`.`user` = `friendships`.`user` 
WHERE `friendships`.`user` in (1,2) 
      AND 
     `friendships`.`active` = 1 
ORDER BY `created` DESC 

PS:可以發佈你的表的模式(或結構)?

更新1

SELECT * 
FROM 
(
    SELECT * 
    FROM `log` INNER `friendships` on 
     `log`.`user` = `friendships`.`user1` 
    WHERE `friendships`.`user1` in (1,2) 
      AND 
      `friendships`.`active` = 1 
    UNION 
    SELECT * 
    FROM `log` INNER `friendships` on 
     `log`.`user` = `friendships`.`user2` 
    WHERE `friendships`.`user2` in (1,2) 
      AND 
      `friendships`.`active` = 1 
) as iTable 
ORDER BY iTable.`created` DESC 
+0

結構在這裏:http://nopaste.me/paste/6149289184f2157074c90c 對不起,但我不能在這裏使用代碼標籤。 感謝您的幫助。發佈的查詢不起作用,因爲我需要user1和user2(第2行和第3行)。我會搜索並閱讀並嘗試編輯查詢以滿足我的需求。 – David

+0

不,這不是我所需要的。我的查詢中的1(用戶1或用戶2必須是)是用戶標識。用戶標識不是靜態的(只是測試用戶的測試)。 – David

+0

@ user1141147 1,2可以替換你的'userID',你仍然可以修改它。我更新了查詢。 –

1

我可能會嘗試不同的方法,這樣的事情也許是:

SELECT * 
FROM `log` 
WHERE `user` IN (
    SELECT `user1` FROM `friendships` WHERE `user2` = @user AND `active` = 1 

    UNION ALL 

    SELECT `user2` FROM `friendships` WHERE `user1` = @user AND `active` = 1 

    UNION ALL 

    SELECT @user 
) 
GROUP BY 
    `arguments` 
ORDER BY 
    `created` DESC 

雖然,說實話,我會避免選擇那些既不列在這樣的查詢中聚合或包含在GROUP BY中,即使MySQL允許我這樣做。

另一種選擇:

SELECT * 
FROM `log` 
WHERE `user` IN (
    SELECT 
    CASE `user1` WHEN @user THEN `user2` ELSE `user1` END AS `user` 
    FROM `friendships` 
    WHERE (`user1` = @user OR `user2` = @user) AND `active` = 1 

    UNION ALL 

    SELECT @user 
) 
GROUP BY 
    `arguments` 
ORDER BY 
    `created` DESC 
+0

謝謝。我發現我愚蠢的失敗。我想要找到每個找到的ID的價值,這就是爲什麼它不適合我的原因。我用2個查詢和UNION ALL解決了它。 – David

+0

謝謝大家。 IN聲明是我所需要的。當然,聯合會也是:)。 – David

1

重構或進入使用UNION一個列表:

select * 
from `log` 
where `user` in (
    select user1 
    from friendships 
    where user1 in (1, 2) and active) 
    union 
    select user2 
    from friendships 
    where `user1` in (1, 2) and active 
) 
group by arguments 
order by `created` desc 

或在標準使用工會加入

select * from (
select l.* 
from `log` l 
join friendships f on l.user = f.user1 and f.user1 in (1, 2) and f.active 
union 
select l.* 
from `log` l 
join friendships f on l.user = f.user2 and f.user2 in (1, 2) and f.active 
) x 
group by arguments 
order by `created` desc