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.
Пытаюсь,
не получается. Выдает:
Alexander 9
Anton 9
Other 2
Vasya 4
Если наоборот, т.е. выбрать именно запрещенных, селектом
то результат правильный
Vasya 2
Other 1
Версия MySQL 4.02, вложенные запросы не поддерживаются. Помогите с селектом, укажите на ошибки, заранее спасибо.
Если работать на базе с релизом выше 4.1, то корректно работает сл. запрос с "подзапросом". Дает правильный результат.
Как переписать это селект, чтобы он работал бы на версии 4.0х (без подзапроса, как я понимаю)?
--------------------
SQL для таблиц
--------------------
Добрый день, нужна помощь.
Таблица 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;
--------------------
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;