2016-01-30 1 views
2

У меня есть таблица, как этотMySql выберите вхождения в двух столбцах приведены третье значение Колума

Sender_id | Receiver_id | Topic 
    456  |  123  | 1 
    123  |  456  | 3 
    123  |  456  | 2 
    456  |  123  | 2 
    123  |  789  | 1 
    123  |  456  | 1 
    123  |  789  | 4 
    456  |  123  | 1 

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

eg. для темы 2, г-н и г-н 123 456 являются только два динамика

Желаемый результат будет иметь только значения: 123, 456

Speakers | Topic 
    123 |  2 
    456 |  2 

это моя первая попытка, но я хочу ВЗ объединить две результирующие столбцы

SELECT * 
FROM (
    SELECT sender_id 
    FROM [table] 
    WHERE topic = '2' 
    AND sender_id !=0 
    GROUP BY sender_id) a 
INNER JOIN (
    SELECT receiver_id 
    FROM [table] 
    WHERE topic = '2' 
    AND receiver_id !=0 
    GROUP BY receiver_id) b 
ON sender_id 
+0

Нужный результат будет иметь только значения: 123, 456. mayeb я overhitnking .. – Francesco

+0

не участвует GROUPING? и, возможно, ПРИСОЕДИНЯЙТЕСЬ, потому что вам нужно пересечь появление отправителей и приемников, чтобы не иметь дюлиментов. – Francesco

ответ

1

Вам не нужно JOIN, вам нужно UNION:

SELECT sender_id Speakers 
    FROM [table] 
    WHERE topic = '2' 
    AND sender_id !=0 
UNION 
SELECT receiver_id 
    FROM [table] 
    WHERE topic = '2' 
    AND receiver_id !=0 

Вам не нужно группировать, чтобы удалять повторяющиеся значения, поскольку UNION делает это для вас.

+0

'2', вероятно, является целым числом – Strawberry

+0

, как получилось объединение, а не JOIN? не обязательно пересечение и не союз? – Francesco

+0

Нет, JOIN/intersection принимает два набора (_A _, _ B_) и объединяет данные, где _A_ ** AND ** _B_ удовлетворяют условию. Это дает вам набор данных с обеих сторон, например. чтобы получить имя говорящего и тему для темы, вы можете 'JOIN'' topic' в 'speaker' при условии, что идентификатор темы равен 2 (' where topic = 2'), давая вам имя темы из _A_ и SpeakerId из _B_. В вашем случае вы просматриваете два набора идентификаторов и применяете одно и то же условие к _isolation_ для создания набора, содержащего элементы, которые являются членами _A_ ** OR ** _B_, или и то, и другое. Это UNION - https://en.wikipedia.org/wiki/Set_theory – Rhumborl

0
DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,Sender_id INT NOT NULL 
,Receiver_id INT NOT NULL 
,Topic INT NOT NULL 
); 

INSERT INTO my_table (sender_id,receiver_id,topic) VALUES 
(456,123,1), 
(123,456,3), 
(123,456,2), 
(456,123,2), 
(123,789,1), 
(123,456,1), 
(123,789,4), 
(456,123,1); 

SELECT speaker FROM 
(
SELECT sender_id speaker,topic FROM my_table 
UNION 
SELECT receiver_id,topic FROM my_table 
) x 
WHERE topic = 2; 
+---------+ 
| speaker | 
+---------+ 
|  123 | 
|  456 | 
+---------+ 
1
SELECT Sender_id as speakers, Topic from Table1 WHERE Topic ='2' 

UNION 

SELECT Receiver_id as speakers, Topic FROM Table1 WHERE Topic = '2' 

Работа скрипку http://sqlfiddle.com/#!9/4cf5e3/2

+0

Что делать, если я хочу исключить себя из динамиков и сказать, что мой идентификатор - 123? – Francesco

+0

@Francesco просто добавляет условие к части динамика - 'WHERE Topic = '2' AND Sender_id <> 123' – Rhumborl

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