SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.04.2010 16:55:09

syscreat
Участник
Зарегистрирован: 20.03.2010
Сообщений: 6

Логические операторы

К примеру, существуют три таблицы: user, attribute и attr_list

CREATE TABLE user (
  user_key INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(40)
);

CREATE TABLE attribute (
  attr_key INT UNSIGNED,
  attr INT UNSIGNED
);

CREATE TABLE attr_list (
  attr_key INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  attr VARCHAR(40)
);

Они созданны таким образом с одной целью - пользователь может задавать для себя атрибуты, которые в текстовом виде будут занесены в attr_list, а таблица attribute будет содержать ссылки межу конкретным пользователем и его атрибутами.

Так, например, attribute может выглядеть следующим образом:

attr_key attr
------------
0         1
0         2
1         1
2         1
2         2

Это означает, что существуют ровно три пользователя и у двух из них одинаковые атрибуты (пользователи 0 и 2).

Вопрос в том, как из таблицы user получить список пользователей имеющих определенные атрибуты.

Запрос:
SELECT DISTINCT user_key, name
FROM user, attribute
WHERE user_key=attr_key AND (attr=1 OR attr=2)

выводит три записи, т.е. для пользователе 0, 1 и 2, в то время как нужно получить список лишь из двух пользователей.

Прошу помочь составить верный запрос.

Заранее благодарен.

Неактивен

 

#2 28.04.2010 18:21:56

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Логические операторы

Только множественным объединением:
JOIN attribute a1 ON user.user_key = a1.attr_key
JOIN attribute a2 ON user.user_key = a2.attr_key
WHERE a1.attr = 1 AND a2.attr = 2

Не очень удачные названия столбцов smile

Неактивен

 

#3 28.04.2010 19:59:33

syscreat
Участник
Зарегистрирован: 20.03.2010
Сообщений: 6

Re: Логические операторы

Искренне благодарен!
//Названия взяты для примера

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson