2016-08-05 55 views
-2

只有一排我有一個表取每個條件

+-------+-------+--------+ 
    id | myid | userid 
+-------+-------+--------+ 
    1 | 123 | 321 
    2 | 321 | 123 
    3 | 123 | 444 
    4 | 444 | 123 
    5 | 123 | 555 
+-------+-------+--------+ 

現在我想取我哪裏有myid='123'

都行,但你看我有無處不在,我希望獲取有限的所有行1 所以最終我得到

ids=[1,3,5]

我使用它來獲取所有行:

SELECT * FROM table 
WHERE (myid='123' AND userid!='123') 
OR (userid='123' AND myid!='123') 
ORDER BY id DESC 

但是這會取所有ID 我可以這樣說嗎?

(
(myid='123' AND userid!='123') 
OR 
(userid='123' AND myid!='123') 
LIMIT 1 
) 
+1

你到底想要什麼?每行都有一個'123',那麼爲什麼你不希望每行都返回? –

+2

如果我有消息,並且我想在每個會話中只有最後一行獲得2個用戶 – Skyey

回答

1

這有什麼錯

SELECT * 
FROM Table 
WHERE (myid = '123' and userid <> '123') OR (myid <> '123' and userid = '123') 
ORDER BY id DESC 
LIMIT 1 
+0

閱讀問題pff,我不希望只有一行我想要每行一行: (myid ='123'AND userid!=' 123')OR(myid!='123'AND userid ='123') – Skyey

+0

OK。我做了一個編輯,我相信應該讓你知道。希望能幫助到你。 –

+0

*「閱讀問題提示」* - 不需要態度。人們在這裏「嘗試」並提供幫助,因爲這也是「免費」的幫助。俗話說,不要「看着嘴裏的禮物馬」。 @Skyey –

1

這可能工作:

SELECT 
    tbl1.id as id, 
    t2.my_id as my_id, 
    t2.userid as userid 
FROM 
    (SELECT 
     max(t1.id) as id, 
    FROM 
     table t1 
    WHERE 
     t1.my_id = 123 or 
     t1.userid = 123 
    GROUP BY 
     if(t1.my_id=123, t1.my_id, t1.userid), 
     if(t1.my_id=123, t1.userid, t1.my_id)) tbl1 
LEFT OUTER JOIN 
    table t2 on t2.id = tbl1.id 

這應該讓你ids=[2,4,5]

+0

如果我有消息,並且我想只爲兩個用戶之間的每次對話獲得最後一行。如果你明白我不需要最後一行,我需要最後一行進行123和444之間的對話,123和321,123和555 – Skyey

+0

@Skyey每個獨特的myid-userid對的最後一行? –

+0

@Skyey請參閱更新 – MonkeyZeus

0

也許你需要的MySQL group_contact功能

select group_concat(id SEPARATOR ',') from table where myid = '123' 
union 
select group_concat(id SEPARATOR ',') from table where userid = '123'; 

這隻回報2行

0

你可以正常化的身份識別碼和用戶ID列這樣

select *, 
      case 
       when myid < userid then myid 
       else userid 
      end as u1, 
      case 
      when myid > userid then myid 
       else userid 
      end as u2 
from t 

+------+------+--------+------+------+ 
| id | myid | userid | u1 | u2 | 
+------+------+--------+------+------+ 
| 1 | 123 | 321 | 123 | 321 | 
| 2 | 321 | 123 | 123 | 321 | 
| 3 | 123 | 444 | 123 | 444 | 
| 4 | 444 | 123 | 123 | 444 | 
| 5 | 123 | 555 | 123 | 555 | 
+------+------+--------+------+------+ 

然後制定出最大的ID這樣

select max(id) from 
(
select *, 
      case 
       when myid < userid then myid 
       else userid 
      end as u1, 
      case 
      when myid > userid then myid 
       else userid 
      end as u2 
from t 
) s 
group by u1,u2 

到給這個

+---------+ 
| max(id) | 
+---------+ 
|  2 | 
|  4 | 
|  5 | 
+---------+ 

,然後加入t等這樣

select t.* 
from  t 
where id in 
(
select max(id) from 
(
select *, 
      case 
       when myid < userid then myid 
       else userid 
      end as u1, 
      case 
      when myid > userid then myid 
       else userid 
      end as u2 
from t 
) s 
group by u1,u2 
) 

給這個

+------+------+--------+ 
| id | myid | userid | 
+------+------+--------+ 
| 2 | 321 | 123 | 
| 4 | 444 | 123 | 
| 5 | 123 | 555 | 
+------+------+--------+ 

無需任何硬編碼!如果你更喜歡第一個會話,則將最大值改爲最小值。