Forum Webscript.Ru

Общие => Базы данных => Тема начата: Covex от 15 Августа 2003, 14:27:28

Название: Select из нескольких таблиц
Отправлено: Covex от 15 Августа 2003, 14:27:28
Hi all!
Есть запрос:
$quer="SELECT * FROM covex_subj, covex_men, covex_toopen, covex_tests WHERE covex_subj.subj_id=covex_toopen.subj_id and covex_men.id=covex_toopen.men_id and covex_tests.subj_id=covex_subj.subj_id and covex_men.id=\'$men_idi\' ORDER BY covex_subj.subj_id";

Результаты, какие  хотелось бы получить: Список предметов и соответствующие им тесты, если есть, или просто предметы без тестов.
По жизни возвращаются только те записи где covex_tests содержит запись, т.е. возвращает список предметов у которых есть тесты, предметы без тестов не возвращаются.
Как это можно победить.
таблицы:

# Table structure for table \'covex_men\'
#информация про пользователей

CREATE TABLE covex_men (
   id smallint(4) NOT NULL auto_increment,
   passw varchar(7) NOT NULL,
   name varchar(50) NOT NULL,
   expire date DEFAULT \'0000-00-00\' NOT NULL,
   level char(2) DEFAULT \'0\',
   email varchar(60) NOT NULL,
   PRIMARY KEY (id),
   UNIQUE passw (passw),
   UNIQUE id (id, passw),
   KEY id_2 (id)
);

# Table structure for table \'covex_tests\'
#информация про тесты

CREATE TABLE covex_tests (
   id smallint(5) unsigned NOT NULL auto_increment,
   subj_id smallint(5) unsigned DEFAULT \'0\' NOT NULL,
   file_names char(10) NOT NULL,
   PRIMARY KEY (id),
   UNIQUE id (id),
   UNIQUE file_names (file_names),
   KEY id_2 (id)
);

#информация про предметы
CREATE TABLE covex_subj (
   subj_id smallint(5) unsigned NOT NULL auto_increment,
   subj_name varchar(100) NOT NULL,
   PRIMARY KEY (subj_id),
   UNIQUE subj_id (subj_id, subj_name),
   KEY subj_id_2 (subj_id)
);



# Table structure for table \'covex_toopen\'
#информация что из предметов кому доступно в колонке tests  информация о  уже пройденных тестах

CREATE TABLE covex_toopen (
   id tinyint(4) NOT NULL auto_increment,
   men_id tinyint(4) DEFAULT \'0\' NOT NULL,
   subj_id tinyint(4) DEFAULT \'0\' NOT NULL,
   tests varchar(160) NOT NULL,
   PRIMARY KEY (id),
   UNIQUE id (id),
   KEY id_2 (id)
);
Название: Select из нескольких таблиц
Отправлено: fidget от 15 Августа 2003, 15:06:12
тебе нужно делать LEFT JOIN предметов на тесты, тогда если тестов для данного предмета нет, то будет NULL выводить.
Название: Select из нескольких таблиц
Отправлено: Covex от 15 Августа 2003, 15:38:03
Спасибо за суппорт!
Вот как я его нарисовал:
$quer="SELECT * FROM covex_toopen, covex_men, covex_subj LEFT JOIN covex_tests ON covex_subj.subj_id = covex_tests.subj_id WHERE covex_subj.subj_id = covex_toopen.subj_id and covex_men.id = covex_toopen.men_id and covex_men.id = \'$men_idi\' ORDER BY covex_subj.subj_id";
Вроде корректно отвечает...