Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Непонятная выборка

8.5K
24 апреля 2005 года
Lesnix
14 / / 03.03.2005
Помогите, пожалуйста с запросом для МуСКЛ(MySQL 4)
Необходимо выбрать из таблицы table1 только те емаилы, которых нет в таблице table2.
Например,
 
Код:
SELECT t1.user_email, t2.any_stuff FROM table1 t1, table2 t2 WHERE t1.user_email
НЕ СОДЕРЖИТСЯ В ПОЛЕ bad_email В ЛЮБОЙ ИЗ СТРОК ТАБЛИЦЫ t2
Конкретнее - в таблице t1 содержатся все емаилы пользователей, а в таблице t2 - емаилы тех, кто не подлежит рассылке.
488
24 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
 
Код:
SELECT user_email, any_stuff FROM table1
  WHERE user_email NOT IN (SELECT bad_email FROM table2)
Но чтоб эта выборка работала, нужна хотя бы четвертая версия MySql.
1.8K
25 апреля 2005 года
MishaSt
170 / / 11.08.2003
Поскольку у меня 3-ий мускул, то я привык к JOIN

SELECT t1.user_email, t2.any_stuff FROM table t1 JOIN LEFT table t2 ON t1.user_email=t2.bad_email WHERE t2.bad_email IS NULL
488
25 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by MishaSt
Поскольку у меня 3-ий мускул, то я привык к JOIN
SELECT t1.user_email, t2.any_stuff FROM table t1 JOIN LEFT table t2 ON t1.user_email=t2.bad_email WHERE t2.bad_email IS NULL


1. SELECT t1.user_email, t2.any_stuff...
нужен t1.any_stuff, ведь из table1 нужно выбрать только тех записей, чьи email-адресов НЕТ в table2.
И в твойом запросе там стояли бы одни NULL-и.

2. Не JOIN LEFT, а LEFT JOIN.

1.8K
25 апреля 2005 года
MishaSt
170 / / 11.08.2003
Цитата:
Originally posted by Mоngооsе
1. SELECT t1.user_email, t2.any_stuff...
нужен t1.any_stuff, ведь из table1 нужно выбрать только тех записей, чьи email-адресов НЕТ в table2.
И в твойом запросе там стояли бы одни NULL-и.


Угу, NULL, any_stuff судя по вопросу (там пример запроса) находится в таблице table2, а не table1, значит автор вопроса ошибся.

Цитата:

2. Не JOIN LEFT, а LEFT JOIN.


Правда, ошибся в попыхах.
Ещё ошибки, что я таблицу саму с собой проJOINил, причём таблицу table.

[root@MishaStrij root]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 87 to server version: 3.23.49-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> CREATE DATABASE test1;
Query OK, 1 row affected (0.10 sec)

mysql> CREATE TABLE table1(ID int unsigned NOT NULL AUTO_INCREMENT, user_email VARCHAR(255), PRIMARY KEY(ID));
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE table2(ID int unsigned NOT NULL AUTO_INCREMENT, bad_email VARCHAR(255), any_stuff TEXT, PRIMARY KEY(ID));
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO table1 VALUES(NULL, 'BillGates@Microsoft.Com');
Query OK, 1 row affected (0.60 sec)

mysql> INSERT INTO table1 VALUES(NULL, 'me@localhost');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO table2 VALUES(NULL, 'me@localhost', 'SuperUser');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT t1.user_email, t2.any_stuff FROM table1 t1 LEFT JOIN table2 t2 ON t1.user_email=t2.bad_email WHERE t2.bad_email IS NULL
-> ;
+-------------------------+-----------+
| user_email | any_stuff |
+-------------------------+-----------+
| [email]BillGates@Microsoft.Com[/email] | NULL |
+-------------------------+-----------+
1 row in set (0.03 sec)

mysql>

8.5K
26 апреля 2005 года
Lesnix
14 / / 03.03.2005
Да, MySQL только 3... так что вложенный запрос не прокатил, а вот за последний пример спасибо - действительно работает...
Но теперь вот задача немного усложнилась...
Надо придумать что-то эквивалентное
 
Код:
SELECT user_id, user_email, username  FROM table1
  WHERE user_email NOT IN (SELECT bad_email FROM table2) AND user_id NOT IN (SELECT bad_userid FROM table2)

То есть чтобы отсеивались не только юзеры с плохими емаилами, но и юзеры с плохими user_id.

Поможете ?
1.8K
26 апреля 2005 года
MishaSt
170 / / 11.08.2003
Цитата:
Originally posted by Lesnix
Да, MySQL только 3... так что вложенный запрос не прокатил, а вот за последний пример спасибо - действительно работает...
Но теперь вот задача немного усложнилась...
Надо придумать что-то эквивалентное
 
Код:
SELECT user_id, user_email, username  FROM table1
  WHERE user_email NOT IN (SELECT bad_email FROM table2) AND user_id NOT IN (SELECT bad_userid FROM table2)

То есть чтобы отсеивались не только юзеры с плохими емаилами, но и юзеры с плохими user_id.

Поможете ?



Да по аналогии уже и сам мог бы додуматься. Надо же учиться!
SELECT t1.userid, t1.user_email, t1.username
FROM table1
LEFT JOIN table2 t2 ON t2.bad_email=t1.user_email
LEFT JOIN table2 t2_2 ON t2_2.bad_userid=t1.userid
WHERE t2.bad_email IS NULL AND t2_2.bad_userid IS NULL

PS. Это левое внешнее объекдинение. Иными словами, берётся таблица t1, и к ней находятся соответствуещие запись из t2 и t2_2. А если соотв. запись не нашлась, то там NULL. Чтоб понял, как работает. Есть ещё RIGHT JOIN, это когда за основу берётся правая таблица, а не левая. А есть INNER JOIN - это уже внутреннее объединение, т.е когда соотв. записи не находится, то строка вообще не выводится. INNER JOIN и запятая семантически эквивалентны (одно и тоже).
http://www.activeserverpages.ru/DataBase/sql/join.asp

8.5K
26 апреля 2005 года
Lesnix
14 / / 03.03.2005
MishaSt,
1. Спасибо. Ща пойду пробовать.
2. Учиться действительно надо. Я вчера и поэкспериментировал с запросами. Но до второго LEFT JOIN не догадался.
Помимо всего прочего мне всегда была ближе 4ая версия MySQL и подзапросы. И последнее: SQL я учу потихоньку и лишь постольку, посколько это необходимо в процессе работы с PHP & ASP.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог