2016-08-05 2 views
-2

У меня есть одна таблицаFetch только один ряд за условия

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

Но это будет приносить все идентификаторы Могу я сказать это?

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

Что именно вы хотите? В каждой строке есть «123», так почему вы не хотите, чтобы каждая строка возвращалась? –

+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 ') ИЛИ (myid! =' 123 'AND userid =' 123 ') – Skyey

+0

ОК. Я сделал редактирование, которое, я полагаю, должно получить именно вас. Надеюсь, поможет. –

+0

* "читать вопрос pff" * - не нужно отношение. Люди здесь, чтобы «попробовать» и помочь, учитывая, что это также «бесплатная» помощь. Поэтому, пожалуйста, не смотрите на лошадь в рот, как говорится. @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

Может быть, вам нужно group_contact функцию MySQL

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

это только возвращение 2 строки

0

Вы можете нормализовать MyId и USERID столбцов, как этот

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

затем выработать максимальный идентификатор, как это

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

, а затем присоединиться к т, как этот

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

Нет необходимости жёстко ничего !! и если вы предпочитаете первый разговор, измените максимальное значение на мин.

Смежные вопросы