2016-02-15 2 views
2

Я довольно новичок в MYSQl. Я пытаюсь создать запрос, который будет соответствовать моим потребностям. Я разработал sqlfiddle.mysql return true, если user_id существует как met_user

Вот история. У меня 5 таблиц. Пользователи, Места, Встречи, Посещение и Встреча.

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

Здесь я повесил трубку. Я хочу показать список ВСЕХ пользователей, которые посещают собрание (на самом деле это должно исключать мой собственный идентификатор). Таким образом, один столбец должен быть user_names, в котором перечислены все пользователи, участвующие в собрании (исключая меня), а другой - список, с которым я встречался, как True или False или что-то подобное. Таким образом, все пользователи посещают определенные meet_id и True для всех тех, кто из таблицы встречаются, у которых есть user_id и их user_ids как met_user.

Я могу достичь множества различных элементов mysql. Я борюсь с этим.

Вот моя схема

CREATE TABLE users (user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        user_name VARCHAR(30) NOT NULL); 

CREATE TABLE places (place_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        place_name VARCHAR(30) NOT NULL); 

CREATE TABLE meetings (meeting_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
         place_id INT(6), 
         meeting_name VARCHAR(30) NOT NULL); 

CREATE TABLE attend (attend_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        meeting_id INT(6), 
        user_id INT(6)); 

CREATE TABLE met (met_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        meeting_id INT(6), 
        user_id INT(6), 
        met_user INT(6)); 

INSERT INTO users (user_name) 
VALUES ('Jason'), ('Billy'), ('Sarah'), ('Julie'), ('Jennifer'), ('Laura') ; 

INSERT INTO places (place_name) 
VALUES ('London'), ('Paris'), ('New York'), ('Rome'); 

INSERT INTO meetings (place_id, meeting_name) 
VALUES ('1', 'London Meeting #1'), ('1','London Meeting #2'), ('2','Paris Meeting'), ('3','New York Meeting'), ('4','Rome Meeting'); 

INSERT INTO attend (meeting_id, user_id) 
VALUES ('1', '1'), ('2','1'), ('1','2'), ('1','3'), ('1','4'), ('1','5'), ('1','6'); 


INSERT INTO met (meeting_id, user_id, met_user) 
VALUES ('1', '1', '2'), ('1', '1', '3'),('1', '1', '4'), ('1', '2', '1'), ('1', '2', '3'), ('1', '2', '4'); 

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

Select u.*, at.meeting_id, at.user_id, m.meeting_name, met.* 
from users as u 
JOIN attend as at 
ON at.user_id = u.user_id 
JOIN meetings as m 
ON at.meeting_id = m.meeting_id 
LEFT JOIN met as met 
ON met.user_id = at.user_id 

Where m.meeting_id = 1 

Этот запрос показывает все мой (я Джейсон в этом примере) met_users, все met_users БИЛЛИ, и нуль для всех остальных участников (что является частью того, что я хочу).

**[Results][2]**: 
| user_id | user_name | meeting_id | user_id |  meeting_name | met_id | meeting_id | user_id | met_user | 
|---------|-----------|------------|---------|-------------------|--------|------------|---------|----------| 
|  1 |  Jason |   1 |  1 | London Meeting #1 |  1 |   1 |  1 |  2 | 
|  1 |  Jason |   1 |  1 | London Meeting #1 |  2 |   1 |  1 |  3 | 
|  1 |  Jason |   1 |  1 | London Meeting #1 |  3 |   1 |  1 |  4 | 
|  2 |  Billy |   1 |  2 | London Meeting #1 |  4 |   1 |  2 |  1 | 
|  2 |  Billy |   1 |  2 | London Meeting #1 |  5 |   1 |  2 |  3 | 
|  2 |  Billy |   1 |  2 | London Meeting #1 |  6 |   1 |  2 |  4 | 
|  3 |  Sarah |   1 |  3 | London Meeting #1 | (null) |  (null) | (null) | (null) | 
|  4 |  Julie |   1 |  4 | London Meeting #1 | (null) |  (null) | (null) | (null) | 
|  5 | Jennifer |   1 |  5 | London Meeting #1 | (null) |  (null) | (null) | (null) | 
|  6 |  Laura |   1 |  6 | London Meeting #1 | (null) |  (null) | (null) | (null) | 
+0

Благодарим за редактирование @ollie Jones. Как ты это сделал? Простите мое невежество. – foxtangocharlie

+0

OFF: вам нужна репутация для этого. – vaso123

+0

Переполнение стека использует Markdown. Когда вы ставите код в вопрос, если вы отступаете его строки на четыре пробела, вы получаете блоки кода. Вы можете редактировать свой вопрос без репутации. –

ответ

1

Вы хотели бы достичь чего-то подобного? (Если нет, то не могли бы вы опубликовать результат запроса вы ожидаете):

select u.user_id,u.user_name, 
    case when exists (select * from met where met.user_id = 1 AND met.met_user = u.user_id) then 'true' else 'false' end didIMeet 
from users as u join attend as at 
    on u.user_id = at.user_id 
    join meetings as m 
    on at.meeting_id = at.meeting_id 
where m.meeting_id = 1 
    and u.user_id <> 1 
+0

Это именно то, на что я надеялся. Спасибо!!! – foxtangocharlie

+0

Далее мне нужно будет указать только тех людей, с которыми я познакомился, и они встретились (они перечислили меня в таблице, и я встретил их в таблице соответствия). Это будет другой вопрос, который я уверен. – foxtangocharlie

+0

Я рад, что это сработало для вас, следующий вопрос также звучит достижимо, дайте ему попробовать и ищите помощи, если вам нужно, ура! –

0

один из возможных решений расширяет ваш запрос:

Select u.*, at.meeting_id, at.user_id, m.meeting_name, met.*, case when met.met_id is null then 'no' else 'yes' end as met 
from users as u 
JOIN attend as at 
ON at.user_id = u.user_id 
JOIN meetings as m 
ON at.meeting_id = m.meeting_id 
LEFT JOIN met as met 
ON (met.user_id = at.user_id and met.met_user = 1) 

Where m.meeting_id = 1 
AND u.user_id != 1 
  • фильтровать user_id из
  • использовать user_id в качестве дополнительного условие соединения в левом соединении
  • использовать случай, когда условное выражение в выборе для получения «да»/«нет» вместо NULL или некоторых чисел

Проблема с этим подходом заключается в том, что ваш встречный стол не полностью заполнен. Для этого вам понадобятся две записи для каждого спаривания: (1 1 3) и (1 3 1), (1 1 4) и (1 4 1) и т. Д. Я думаю, вам понадобится полное соединение в любом случае, как только вы хотите повторить запрос для другого пользователя.

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