2015-05-08 3 views
1

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

Я получил эту таблицу:

userid | email    | newsletters 
    1 | [email protected] | 1,2 
    2 | [email protected] | 1 

Теперь я хотел бы получить всю электронную почту-адреса пользователей, которые хотят получить бюллетень «2».

Это было бы:

email | newsletters 
[email protected] | 1,2 

И конечно же: В другом запросе все пользователи, которые подписавшись бюллетень № 1:

Результат:

email | newsletters 
[email protected] | 1,2 
[email protected] | 1 

Что бы правильно SQL-запрос? Я думаю, что это должно быть правильным началом, но я не знаю, какое состояние я должен использовать:

SELECT email FROM users WHERE newsletter CONDITION? 

Не могли бы вы мне помочь? :-)

+1

1. См нормализации – Strawberry

+0

вы должны нормализовать 'newsletters' информацию поэтому вам не нужно делать эти хаки .. но что-то вроде «%, 2% или как» 2,% '' должно достичь цели – amdixon

+0

@amdixon - ваше предложение не будет работать, если 'newsletters' просто' 2'' –

ответ

2

Это сделает работу при условии, количество бюллетень не может быть выше, чем 9:

SELECT email FROM users WHERE newsletters LIKE '%2%' 

Если вы хотите, чтобы иметь больше из них, то таблица нормализации было бы очень полезно.

EDIT: @sgeddes в комментариях имеет большое предложение, чтобы сделать его работу для любого количества бюллетеней:

SELECT email FROM users WHERE concat(',',newsletters,',') LIKE '%,2,%' 
+0

1,12 похоже на «% 2%» .. – amdixon

+1

Прочтите снова мой ответ: «Это сделает работу, предполагая, что у вас есть <10 newsletters " –

+0

Это будет неправильно возвращать записи, где информационный бюллетень содержит« 2 », включая, например,« 1,12,15 ». –

0

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

User table 
userid | email    
    1 | [email protected] 
    2 | [email protected] 

Newspaper table 
paperid | name 
     1 | the Sun 
     2 | the Mirror 

UserNewspaper Bridge table 
userid | paperid  (represents, not part of table) 
    1 | 1   ([email protected] receives the Sun) 
    1 | 2   ([email protected] receives the Mirror) 
    2 | 1   ([email protected] receives the Sun) 

Чтобы получить весь электронную почту-адрес пользователей, которые хотят paperid 2 вы бы написать так:

select a.email 
from User a, 
     UserNewspaper b 
where a.userid = b.userid 
and b.paperid = 2 

Чтобы получить всю электронную почту-адреса пользователей, которые хотят Зеркало вы бы написать это:

select a.email 
from User a, 
     UserNewspaper b, 
     Newspaper c 
where a.userid = b.userid 
and b.paperid = c.paperid 
and c.name = 'the Mirror' 
Смежные вопросы