2017-01-05 7 views
1

У меня есть запрос, как показано ниже:Как понять внутреннее соединение mysql?

users = select * from users where group_id = 1 and track_id = "xxxxxx"; 
user_ids = [user.id for user in users] 
tickets = select * from tickets where group_id = 1 and user_id in (user_ids); 

users и tickets таблицы все иметь group_id поле.

Индекс таблицы пользователей находится на group_id и track_id; Индекс таблицы билетов находится на group_id и user_id.

Я хочу объединить два sql в один.

select * from tickets join users on tickets.user_id = users.id 
where tickets.group_id = 1 and users.track_id = "xxxxx"; 

или

select * from tickets join users on tickets.user_id = users.id 
where users.group_id = 1 and users.track_id = "xxxxx";; 

Правильно ли это? что лучше? Я как то, что смысл внутреннего соединения, но я хочу знать, я должен использовать tickets.group_id или users.group_id? В чем разница?

Как понять внутреннее соединение mysql? Как это работает?

+0

Возможно, вы захотите начать со своей документации: http://dev.mysql.com/doc/refman/5.7/en/join.html – Daerik

+0

@Siyual Что это связано с внутренним и внешним соединением? – Barmar

+0

@ Barmar Это не так, но ответы в нем четко отвечают на вопрос о том, как работают внутренние соединения. – Siyual

ответ

1

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

SELECT * 
FROM tickets AS t 
JOIN users AS u ON t.user_id = u.user_id 
WHERE t.group_id = 1 
AND u.group_id = 1 
+0

Это действительно зависит от того, что он ищет. Если он хочет все билеты для группы 1 независимо от того, в какой группе находится пользователь, тогда 't.group_id = 1' - единственное, что необходимо в' where' – CptMisery

+0

@CptMisery. Посмотрите на исходные запросы, которые он хочет объединить. Он использовал 'users.group_id = 1', чтобы получить список идентификаторов пользователей, а затем« tickets.group_id = 1 »при получении билетов, принадлежащих этим пользователям. Чтобы получить эквивалентный эффект, он должен проверить их как в соединении. – Barmar

+0

@ Бармар, вы правы! Если оба group_id, я обнаружил, что mysql просматривает меньше строк, все таблицы используют индекс. – pangpang

0

Ваш первый запрос предоставит вам все билеты для группы 1, и пользователи могут быть в любой группе. Второй запрос предоставит вам все билеты для пользователей в группе 1, даже если билет находится в группе 2.

1

Рассмотрите дополнительные критерии присоединения: Если group_ID всегда будет одинаковым в обеих таблицах, тогда вы должны добавить group_ID в качестве критериев присоединения и фильтровать либо с помощью, либо с помощью.

SELECT * 
FROM tickets join users 
    on tickets.user_id = users.id 
and tickets.group_ID = users.group_ID 
WHERE tickets.group_id = 1 and users.track_id = "xxxxx"; 

В качестве альтернативы вы должны фильтровать на обоих: потому что GROUP_ID может отличаться от TICKET_ID, вы должны фильтровать по обоим.

Это наиболее точно представляет объединение ваших двух запросов. если group_ID не совпадает с билетами и пользователями при подключении.

SELECT * 
FROM tickets join users 
    on tickets.user_id = users.id 
WHERE tickets.group_id = 1 
    and users.group_id = 1 
    and users.track_id = "xxxxx"; 

Логично, однако, нам нужно понять цель «GROUP_ID» в обеих таблицах. Какова функциональная цель каждого из них? Я могу представить, как продавать группы билетов ... но я не вижу, как пользователь может находиться в статической группе, поскольку в зависимости от события пользователь может быть более чем в одной группе с течением времени.

Возможно, у вас не должно быть group_ID в обеих таблицах? Возможно, вам нужна таблица групп пользователей ...

Если две группы представляют разные фундаментальные атрибуты объекта, то они должны оцениваться отдельно; таким образом, второй вопрос имеет наибольший смысл. Однако, если они представляют один и тот же атрибут сущности, то добавление к критерию присоединения имеет смысл

+0

хороший ответ! Я думаю, что для таблицы билетов group_id не требуется. Но я удаляю group_id из билета, mysql сканирует все строки билета. – pangpang

+0

Пользователи group_id представляют пользователя, принадлежащее группе; для идентификатора группы билетов. Если я хочу получить билеты на группы пользователей, я могу сделать так: 'select * from tickets where group_id = 1;' пользователи и билеты просто пример. – pangpang

+0

Я до сих пор не понимаю функциональную цель обоих. возможно, дизайн базы данных немного выключен ?. Может быть, сегодня пользователь входит в группу. покупает билет, позже они принадлежат к другой группе и покупают билет, поэтому значение group_ID в билетах для каждого пользователя представляет собой идентификатор группы в момент, когда пользователь совершил покупку? Опять же, недостаточно функциональной информации, чтобы знать, как/почему группы используются, таким образом, два потенциальных ответа на соединение. Является ли GROUP_ID FK таблицей с именем Group в обоих случаях с идентификатором, который является первичным ключом? – xQbert

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