2010-10-09 2 views
1

Взгляните на следующий MYSQL запрос:MySQL автообъединение вопрос

SELECT fname,lname FROM users WHERE users.id IN (SELECT sub FROM friends WHERE friends.dom = 1) 

Этот запрос первым создает множество всех friends.sub с помощью внутреннего запроса, а затем внешний запрос выбирает список пользователи, где идентификаторы пользователя содержатся в наборе, создаваемом внутренним запросом (т. е. объединение двух наборов).

И это отлично работает. Но если вам необходимо внутренний набор содержит не только подводные лодки, где дом = 1, но и Домс где к югу = 1, например, так: Внешний запрос остается таким же, как и выше, чистый псевдокод:

(SELECT sub FROM friends WHERE friends.dom = 1) 
***AND*** 
(SELECT dom FROM friends WHERE friends.sub = 1) 

Является ли это возможно сделать такую ​​функциональность с внутренним запросом?

помощь или помощь оценили ребята ;-D

Большое спасибо, ребята, моя головная боль уже нет!

ответ

1

Попробуйте это:

SELECT u.fname, u.lname 
FROM users u 
INNER JOIN friends f 
    ON (u.id = f.sub AND f.dom = 1) 
    OR (u.id = f.dom AND f.sub = 1)
+0

Хорошие ребята! это самый оптимальный подход? –

+0

@ DJDonaL3000: Да, я так считаю. Если вы планируете иметь много записей, вы должны убедиться, что 'sub' и' dom' проиндексированы правильно. Вы можете использовать команду MySQL ['EXPLAIN'] (http://dev.mysql.com/doc/refman/5.0/en/explain.html), чтобы узнать, использует ли запрос индекс или нет. –

+0

Как пользователи и друзья объединяются, когда они разные таблицы? – Xailor

1

Я не уверен, если я правильно понимаю, что sub и dom представляют, но это выглядит, как вы можете использовать UNION там:

SELECT fname, lname 
FROM users 
WHERE users.id IN 
     ( 
      SELECT sub FROM friends WHERE friends.dom = 1 
      UNION 
      SELECT dom FROM friends WHERE friends.sub = 1 
     ); 

Тестовый случай :

CREATE TABLE users (id int, fname varchar(10), lname varchar(10)); 
CREATE TABLE friends (dom int, sub int); 

INSERT INTO users VALUES (1, 'Bob', 'Smith'); 
INSERT INTO users VALUES (2, 'Peter', 'Brown'); 
INSERT INTO users VALUES (3, 'Jack', 'Green'); 
INSERT INTO users VALUES (4, 'Kevin', 'Jackson'); 
INSERT INTO users VALUES (5, 'Steven', 'Black'); 

INSERT INTO friends VALUES (1, 2); 
INSERT INTO friends VALUES (1, 3); 
INSERT INTO friends VALUES (4, 1); 
INSERT INTO friends VALUES (3, 4); 
INSERT INTO friends VALUES (5, 2); 

Результат:

+-------+---------+ 
| fname | lname | 
+-------+---------+ 
| Peter | Brown | 
| Jack | Green | 
| Kevin | Jackson | 
+-------+---------+ 
3 rows in set (0.00 sec) 

Более того, @Alec's solution, вероятно, более эффективен.

+0

doms и subs просто представляют идентификаторы пользователей. Если пользователь 1 является пользователем 2s friend dom = 1 и sub = 2 –

+0

Хорошая работа ... 10 из 10 mate ;-D –

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