MySQL получает только строки с уникальным значением для определенного поля - PullRequest
1 голос
/ 10 октября 2010

Я хочу получить только строки с уникальным значением для определенного поля (на самом деле 2).Моя таблица выглядит так:

id    senderID    receiverID    ...    ...    ...
_________________________________________________
0     0           1             ...    ...    ...
1     2           1             ...    ...    ...
2     1           0             ...    ...    ...
3     0           2             ...    ...    ...
4     2           0             ...    ...    ...
5     1           2             ...    ...    ...

В этой таблице id уникально всегда .senderID - это идентификатор пользователя, отправившего сообщение, receiverID - это идентификатор пользователя, получившего сообщение.... - это некоторые поля (например, text), которые на самом деле не имеют значения, и они также не уникальны.

Итак, прежде всего, я хочу получить все строки, где я (# 1)отправитель или получатель.

SQL: "SELECT id FROM table WHERE senderID='1' OR receiverID='1'";

Это вернет (0, 1, 2, 5).

Но сейчас я хочу только все уникальные записи.Итак, условия:

  1. 1 должен быть идентификатором отправителя или получателя.
  2. if ((senderID == '1' && "__ receiverID is not yet listed__") || (receiverID == '1' && "__ senderID is not yet listed__")) в псевдокоде.

Окончательный вариантвозвращаемое значение должно быть (0, 1).

Как мне это сделать в (My) SQL?Я знаю, как сделать это с помощью PHP, но когда тысячи записей, это уже недостаточно быстро.

С уважением,

Тим

Ответы [ 3 ]

2 голосов
/ 10 октября 2010

Если вы сделаете это, вы получите все отличные идентификаторы, где вы находитесь, и отличные идентификаторы, где вы находитесь.

Кроме того, UNION объединит оба результата.По вашей логике, вы можете использовать значение 2-го столбца ('S' / 'R'), чтобы отфильтровать 2 набора, если вам нужно сделать что-то отдельно для отправленных / полученных идентификаторов.

2 голосов
/ 10 октября 2010
select min(id) from 
(
  select id, senderID pID from table where receiverID = '1'
  union
  select id, receiverID pID from table where senderID = '1'
) as fred
group by pID;

Для вашего набора данных это дает:

+---------+
| min(id) |
+---------+
|       0 |
|       1 |
+---------+
1 голос
/ 10 октября 2010

Что-то вроде

SELECT DISTINCT id, senderID, receiverID FROM table WHERE senderID='1' OR receiverID='1';

DISTINCT ключевое слово удалит все дубликаты из результата. Пока работает хорошо, вы не добавляете никаких других столбцов, кроме id, senderID и receiveID.

В противном случае вы также можете использовать предложение GROUP BY

SELECT id FROM table WHERE senderID='1' OR receiverID='1' GROUP BY senderID, receiverID;
...