Исключающий SELECT из 3-х таблиц

void

Новичок
Исключающий SELECT из 3-х таблиц

Добрый день, нужна помощь.


Таблица t1
------------------------------------
id sname
------------------------------------
1 Vasya
2 Sergey
3 Alexander
4 Anton
5 Other



Таблица t2
------------------------------------
id ofrom oto
------------------------------------
1 Alexander Sergey
2 Alexander Sergey
3 Alexander Sergey
4 Anton Sergey
5 Anton Sergey
6 Anton Sergey
7 Other Sergey
8 Sergey Alexander
9 Vasya Sergey
10 Vasya Sergey



Таблица t3
-------------------------------------
id ifrom ito
-------------------------------------
1 Vasya Sergey
2 Other Sergey
3 Sergey Alexander


t1.sname, пара t3.ifrom-t3.ito - unique

t1 - список юзернеймов, каждый юзер уникален
t2 - кто кому послал сообщение
t3 - чьи (ifrom) сообщения исключать в селекте, если селект - ito.

Проще говоря, Сергею посланы сообщения от Александра, Антона, Васи и Other-а. Результатом селекта должны быть в формате

Отправитель (sname), КРОМЕ тех кто в в t3.ifrom и кол-во сообщений (от незапрещенных). В запрете Vasya и Other.

Пытаюсь,

PHP:
SELECT t1.sname, COUNT(t1.id) AS quan FROM t1, t2, t3 WHERE t2.oto = 'Sergey' AND t2.ofrom = t1.sname AND t1.sname != t3.ifrom GROUP BY t2.ofrom;
не получается. Выдает:

Alexander 9
Anton 9
Other 2
Vasya 4


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

PHP:
SELECT t1.sname, COUNT(t1.id) AS quan FROM t1, t2, t3 WHERE t2.oto = 'Sergey' AND t2.ofrom = t1.sname AND t1.sname = t3.ifrom GROUP BY t2.ofrom;
то результат правильный

Vasya 2
Other 1

Версия MySQL 4.02, вложенные запросы не поддерживаются. Помогите с селектом, укажите на ошибки, заранее спасибо.

Если работать на базе с релизом выше 4.1, то корректно работает сл. запрос с "подзапросом". Дает правильный результат.

PHP:
SELECT *, COUNT(*) AS quan FROM t2 WHERE NOT EXISTS (SELECT * FROM t3 WHERE t3.ifrom = t2.ofrom AND t3.ito = t2.oto) AND t2.oto = 'Sergey' GROUP BY t2.ofrom;
Как переписать это селект, чтобы он работал бы на версии 4.0х (без подзапроса, как я понимаю)?

--------------------
SQL для таблиц
--------------------

PHP:
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
  `id` int(11) NOT NULL auto_increment,
  `sname` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

LOCK TABLES `t1` WRITE;

INSERT INTO `t1` VALUES (1,'Vasya');
INSERT INTO `t1` VALUES (2,'Sergey');
INSERT INTO `t1` VALUES (3,'Alexander');
INSERT INTO `t1` VALUES (4,'Anton');
INSERT INTO `t1` VALUES (5,'Other');
UNLOCK TABLES;

DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` (
  `id` int(11) NOT NULL auto_increment,
  `ofrom` varchar(255) NOT NULL default '',
  `oto` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

LOCK TABLES `t2` WRITE;

INSERT INTO `t2` VALUES (1,'Alexander','Sergey');
INSERT INTO `t2` VALUES (2,'Alexander','Sergey');
INSERT INTO `t2` VALUES (3,'Alexander','Sergey');
INSERT INTO `t2` VALUES (4,'Anton','Sergey');
INSERT INTO `t2` VALUES (5,'Anton','Sergey');
INSERT INTO `t2` VALUES (6,'Anton','Sergey');
INSERT INTO `t2` VALUES (7,'Other','Sergey');
INSERT INTO `t2` VALUES (8,'Sergey','Alexander');
INSERT INTO `t2` VALUES (9,'Vasya','Sergey');
INSERT INTO `t2` VALUES (10,'Vasya','Sergey');
UNLOCK TABLES;

DROP TABLE IF EXISTS `t3`;
CREATE TABLE `t3` (
  `id` int(11) NOT NULL auto_increment,
  `ifrom` varchar(255) NOT NULL default '',
  `ito` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

LOCK TABLES `t3` WRITE;

INSERT INTO `t3` VALUES (1,'Vasya','Sergey');
INSERT INTO `t3` VALUES (2,'Other','Sergey');
INSERT INTO `t3` VALUES (3,'Sergey','Alexander');
UNLOCK TABLES;
 

tardis

lazy
а в t2 и t3 писать id'шники юзеров вместо имен религия не позволяет?

почитай про LEFT JOIN
сделай выборку из t2, t3 запрещенных и отбери те, которые в полях t3 имеют NULL
 
Сверху