powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите с Select`ом из одной табл. тех знач., кот-ых нет в другой
5 сообщений из 5, страница 1 из 1
помогите с Select`ом из одной табл. тех знач., кот-ых нет в другой
    #32735150
Anton Kudris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для начала приведу описания таблиц:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE `players` (
  `id` int( 10 ) unsigned NOT NULL auto_increment,
  `fio` varchar( 250 ) NOT NULL default '',
        ... большинство столбцов я выкинул, т.к. они в данном случае не важны ...
  `authorized` tinyint( 1 ) NOT NULL default '0',
  PRIMARY KEY  (`id`),
) ENGINE=MyISAM

CREATE TABLE `victorina_players` (
  `victorina_id` int( 10 ) unsigned NOT NULL default '0',
  `date` date NOT NULL default '0000-00-00',
  `player_id` int( 10 ) unsigned NOT NULL default '0',
  PRIMARY KEY  (`victorina_id`,`player_id`)
) ENGINE=MyISAM

Смысл такой, что в первой таблице у нас список игроков и главное - их id. Вторая таблица содержит id викторины и id игрока, а также дату, когда игрок в викторине участвовал.
Пусть у нас есть викторина с id = 1. Во второй таблице будут записываться даты и id игроков по мере того, как они в этой викторине поучаствуют.

Задача: выбрать из ПЕРВОЙ таблицы (players) список id тех игроков, которые НЕ участвовали в заданной викторине.
Я нацарапал вот это:

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT a.id FROM players a 
LEFT JOIN (
SELECT player_id 
FROM victorina_players 
WHERE victorina_id =  1 
) b ON a.id = b.player_id
WHERE b.player_id IS NULL

Работает... НО! мне нужно переписать этот запрос для mysql < 4.1 т.е. БЕЗ вложенных выборок. Причем задача усложняется тем, что условие WHERE victorina_id = 1 может дополниться OR victorina_id = 2 OR victorina_id = 3 ... и т.д.

Помогите пожалуйста
...
Рейтинг: 0 / 0
помогите с Select`ом из одной табл. тех знач., кот-ых нет в другой
    #32735408
MySQL doc:
авторIf there is no matching record for the right table in the ON or USING part in a LEFT JOIN, a row with all columns set to NULL is used for the right table. You can use this fact to find records in a table that have no counterpart in another table:
Код: plaintext
1.
2.
SELECT table1.* FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL
...
Рейтинг: 0 / 0
помогите с Select`ом из одной табл. тех знач., кот-ых нет в другой
    #32736168
Anton Kudris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олег ОлеговичMySQL doc:
авторIf there is no matching record for the right table in the ON or USING part in a LEFT JOIN, a row with all columns set to NULL is used for the right table. You can use this fact to find records in a table that have no counterpart in another table:
Код: plaintext
1.
2.
SELECT table1.* FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL

Если внимательно перечитать мое сообщение, то видно, что я этот факт уже использовал. Только вот проблема в том, что нужно из второй таблицы записи ограничить,а не все брать.
Пока придумал создавать временную таблицу, записывать туда всё что нужно для выборки и уже потом делать, как у вас написано
...
Рейтинг: 0 / 0
помогите с Select`ом из одной табл. тех знач., кот-ых нет в другой
    #32736543
wlck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
SELECT players.id 
FROM players LEFT JOIN victorina_players 
ON players.id = victorina_players .player_id AND victorina_players.victorina_id =  1 
WHERE victorina_players .player_id IS NULL
...
Рейтинг: 0 / 0
помогите с Select`ом из одной табл. тех знач., кот-ых нет в другой
    #32737213
Anton Kudris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wlck
Код: plaintext
1.
2.
3.
SELECT players.id 
FROM players LEFT JOIN victorina_players 
ON players.id = victorina_players .player_id AND victorina_players.victorina_id =  1 
WHERE victorina_players .player_id IS NULL

Вот спасибо! как раз то, что мне и было нужно. Это заменит мне мою корявую поделку с двумя запросами
Код: plaintext
1.
2.
3.
4.
CREATE TEMPORARY TABLE thegame_vict_players (player_id INT( 10 ) NOT NULL) 
TYPE = MyISAM SELECT player_id FROM victorina_players WHERE victorina_players.victorina_id =  1  OR victorina_players.victorina_id =  2 ;

SELECT a.id FROM players a LEFT JOIN thegame_vict_players b ON a.id = b.player_id WHERE b.player_id IS NULL;

еще раз спасибо
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите с Select`ом из одной табл. тех знач., кот-ых нет в другой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]