Mysql объединить три таблицы проблема - PullRequest
0 голосов
/ 21 ноября 2010

Я использую три таблицы MySQL, которые выглядят так:

Таблица для учетных записей участников

|       id     |     name    |   status   |
-------------------------------------------
|       1      |      mike   |      0     |
|       2      |      peter  |      1     |
|       3      |      john   |      1     |
|       4      |      any    |      1     |

Таблица для списка друзей:

|    myid     |    user     |    date    |
------------------------------------------
|     10      |     2       | 2010-01-04 |
|     3       |     10      | 2010-09-05 |
|     4       |     10      | 2010-10-23 | 

Таблица для пользователей галерей:

|    fotoid     |    userid     |    pic1    |
------------------------------------------
|      101      |       2       |    1.jpg   |
|      102      |       3       |    2.jpg   |
|      103      |       4       |    3.jpg   |

Я хочу присоединиться к этим трем таблицам и получить результат запроса, в котором будут перечислены пользователи, которых я добавил в список друзей, и те, кто добавил меня в список одновременно, все эти пользователи должны иметь статус '1 'из таблицы участников и покажите их фотографии из таблицы галереи.

В этом примере мой идентификатор «10». В таблице для галереи поле «MyID» представляет тех пользователей, которые добавили других пользователей к своим друзьям, в то время как «пользователь» является идентификатором добавленных пользователей.

Конечный результат в этом примере должен выглядеть следующим образом:

|    id    |   name   |   status   |    pic1   |
------------------------------------------------
|    2     |  peter   |     1      |   1.jpg   |
|    3     |  john    |     1      |   2.jpg   |
|    4     |  any     |     1      |   3.jpg   |

Как я могу это сделать?

mysql ОБЪЯСНИТЬ:

id  |  select_type     |  table  |    type   |   possible_keys   |  key    |   key_len   |    ref    |    rows   |    extra                            
-------------------------------------------------------------------------------------------------------------------------------------------------
1   |  primary         |   g     |   ALL     |   id              |  NULL   |   NULL      |   NULL    |   7925    |  Using where
1   |  primary         |   a     |   eg_ref  |   id              |  id     |   4         |   g.id    |   1       |  Using where
2   |DEPENDENT SUBQUERY|   a2    |   index   |   id              |  NULL   |   NULL      |   NULL    |   90734   |  Using index; Using temporary; Using filesort;
2   |DEPENDENT SUBQUERY|   f     |   index   |   rds_index       |rds_index|   8         |   NULL    |   138945  |  Using where;Using index;Using join buffer 

1 Ответ

2 голосов
/ 21 ноября 2010
SELECT a.id, 
       a.name, 
       a.status, 
       g.pic1 
FROM   accounts a 
       JOIN galleries g 
         ON g.userid = a.id 
WHERE  a.id IN (SELECT a2.id 
                FROM   accounts a2 
                       JOIN friends f 
                         ON ( f.myid = a2.id 
                               OR f.user = a2.id ) 
                WHERE  ( f.myid = 10 
                          OR f.user = 10 ) 
                GROUP  BY a2.id) 
       and a.status = 1 

РЕДАКТИРОВАТЬ 1

Давайте пока возьмем подзапрос, а пока потеряем группу по материалу:

Убедитесь, что у вас есть индексы для этих столбцов:

accounts.id
friends.myid
friends.user

И выполнить этот запрос:

SELECT a2.id 
FROM   accounts a2 
       JOIN friends f 
         ON f.myid = a2.id 
WHERE  f.user = 10 
UNION ALL 
SELECT a2.id 
FROM   accounts a2 
       JOIN friends f 
         ON f.user = a2.id 
WHERE  f.myid = 10 

Затем опубликуйте, как долго вы играете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...