Непонятная выборка
Необходимо выбрать из таблицы table1 только те емаилы, которых нет в таблице table2.
Например,
НЕ СОДЕРЖИТСЯ В ПОЛЕ bad_email В ЛЮБОЙ ИЗ СТРОК ТАБЛИЦЫ t2
WHERE user_email NOT IN (SELECT bad_email FROM table2)
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
Поскольку у меня 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. 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>
Но теперь вот задача немного усложнилась...
Надо придумать что-то эквивалентное
WHERE user_email NOT IN (SELECT bad_email FROM table2) AND user_id NOT IN (SELECT bad_userid FROM table2)
То есть чтобы отсеивались не только юзеры с плохими емаилами, но и юзеры с плохими user_id.
Поможете ?
Да, MySQL только 3... так что вложенный запрос не прокатил, а вот за последний пример спасибо - действительно работает...
Но теперь вот задача немного усложнилась...
Надо придумать что-то эквивалентное
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
1. Спасибо. Ща пойду пробовать.
2. Учиться действительно надо. Я вчера и поэкспериментировал с запросами. Но до второго LEFT JOIN не догадался.
Помимо всего прочего мне всегда была ближе 4ая версия MySQL и подзапросы. И последнее: SQL я учу потихоньку и лишь постольку, посколько это необходимо в процессе работы с PHP & ASP.