Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Приветствую всех!
Имеется основная таблица
"CREATE TABLE IF NOT EXISTS `main_tab` " &
"(ID INT(11) NOT NULL auto_increment, " &
"PRIMARY KEY (`ID`), " &
"timestamp TIMESTAMP, " &
"id_filial INT(11) NOT NULL, " &
"FOREIGN KEY (id_filial) REFERENCES filial_tab (ID), " &
"id_user INT(11) NOT NULL, " &
"FOREIGN KEY (id_user) REFERENCES user_tab (ID), " &
"id_viddela INT(11) NOT NULL, " &
"FOREIGN KEY (id_viddela) REFERENCES viddela_tab (ID), " &
"id_contragent INT(11) NOT NULL, " &
"FOREIGN KEY (id_contragent) REFERENCES contragent_tab (ID), " &
"id_opponent INT(11) NOT NULL, " &
"FOREIGN KEY (id_opponent) REFERENCES contragent_tab (ID), " &
"object VARCHAR(128), " &
"cena_agents INT(11), " &
"FOREIGN KEY (cena_agents) REFERENCES cena_agents_tab (ID), " &
"zajm INT(11) NOT NULL, " &
"avans INT(11) NOT NULL, " &
"status_set_log INT(11) NOT NULL, " &
"FOREIGN KEY (status_set_log) REFERENCES status_set_log_tab (ID), " &
"comments VARCHAR(128))"
как видно большая часть столбцов имеет REFERENCES
при этом таблица status_set_log :
"CREATE TABLE IF NOT EXISTS `status_set_log_tab`" &
"(ID INT(11) NOT NULL auto_increment, " &
"PRIMARY KEY (`ID`), " &
"timestamp TIMESTAMP, " &
"id_user INT(11) NOT NULL, " &
"FOREIGN KEY (id_user) REFERENCES user_tab (ID), " &
"id_status INT(11) NOT NULL, " &
"FOREIGN KEY (id_status) REFERENCES status_tab (ID))"
тоже имеет связь с таблицей status_tab:
"CREATE TABLE IF NOT EXISTS `status_tab`" &
"(ID INT(11) NOT NULL auto_increment, " &
"PRIMARY KEY (`ID`), " &
"status VARCHAR(128) NOT NULL)"
остальные таблицы по ссылке являются конечными, например
"CREATE TABLE IF NOT EXISTS `filial_tab`" &
"(ID INT(11) NOT NULL auto_increment, " &
"PRIMARY KEY (`ID`), " &
"filial VARCHAR(128) NOT NULL)"
обычный SELECT * FROM `main_tab` выводит только номера ID ссылок, вместо текста.
так вот, основной вопрос заключается в том, как реализовать запрос, что бы вывести строки таблицы main_tab, у которой должны быть заполнены все ссылки, в том числе и из таблицы status_set_log, у которой имеется собственная ссылка.
Заранее благодарен в помощи!!!
Неактивен
eip написал:
обычный SELECT * FROM `main_tab` выводит только номера ID ссылок, вместо текста.
так вот, основной вопрос заключается в том, как реализовать запрос, что бы вывести строки таблицы main_tab, у которой должны быть заполнены все ссылки, в том числе и из таблицы status_set_log, у которой имеется собственная ссылка.
Заранее благодарен в помощи!!!
NOT NULL в определении полей и так гарантирует вам, что заполнены все ссылки. Если нужен текст вместо id, то используйте JOIN
Если я не правильно вас понял, то приводите тестовый набор данных и желаемый на нем результат.
Неактивен
я имею ввиду, то что SELECT * FROM `main_tab` выводит мне номера ID, а не информацию на которую ID ссылается (само текстовое значение)
например я хочу что бы в поле status_set_log выводился не номер, а соответсвующая информация из таблицы status_set_log_tab (при этом status_set_log_tab заполняется из status_tab)
так же с полем filial_tab чтобы не номер ID писался а значение из filial_tab из поля filial
Неактивен
используйте join
select filial from main_tab join filial_tab on id_filial=filial_tab.ID;
Неактивен
vasya написал:
используйте join
select filial from main_tab join filial_tab on id_filial=filial_tab.ID;
vasya, спасибо за помощь, а как сформировать запрос, что бы вывести все поля main_tab
ID, timestamp,id_filial, id_user, id_viddela, id_contragent, id_opponent, object, cena_agents, zajm, avans, status_set_log, comments
с подставленными значениями. Уж простите меня SQL не мой конек))) но очень надо
Неактивен
и непонятен такой момент JOIN используется для создания внешнего объединения таблиц, а
SELECT FROM используется для внутреннего объединения
учитывая что у меня прописаны REFERENCES разве я не могу использовать запрос SELECT FROM без JOIN ?
или я что то путаю?
Неактивен
перечислить все поля, т.е.
Неактивен
eip написал:
и непонятен такой момент JOIN используется для создания внешнего объединения таблиц, а
SELECT FROM используется для внутреннего объединения
учитывая что у меня прописаны REFERENCES разве я не могу использовать запрос SELECT FROM без JOIN ?
или я что то путаю?
select from это просто выборка
join это внутреннее объединение
Посмотрите этот пост, там очень хорошо расписано.
Неактивен
отлично! Ваш пример меня спас, только остался один маленький нюанс если я добавляю поле запрос к status_set_log_tab, которая ссылается на status_tab, то возникает ошибка. может status_set_log_tab как то предварительно сформировать надо?
Неактивен
Приводите запрос и ошибку. Подозреваю, что вам нужно
select .. status_tab.status ... from
...
join status_set_log_tab on m.status_set_log=status_set_log_tab.ID
join status_tab on status_set_log_tab.id_status=status_tab.ID
Неактивен
Прописал я вот такую штуку
("SELECT m.id, m.timestamp, filial_tab.filial, user_tab.user, viddela_tab.vid, contragent_tab.name, contragent_tab.name, m.object, " &
"m.cena_agents_zap, m.cena_agents_pkd, m.cena_agents_pase, m.zajm, m.avans, status_tab.status, m.comments " &
"FROM main_tab m " &
"join filial_tab on m.id_filial=filial_tab.ID " &
"join user_tab on m.id_user=user_tab.ID " &
"join viddela_tab on m.id_viddela=viddela_tab.ID " &
"join contragent_tab on m.id_contragent=contragent_tab.ID and m.id_opponent=contragent_tab.ID " &
"join status_tab on m.status=status_tab.ID "
и появилась новая засада на строчке join contragent_tab on m.id_contragent=contragent_tab.ID and m.id_opponent=contragent_tab.ID "
в таблице contragent_tab хранятся как агенты так и контрагенты, пытаюсь вышеуказанным запросом вывести все записи, выводи только где id_contragent=id_opponent
оператор and заменил на or стал выводить все записи но каждую в две строки
как вывести всю таблицу? подставляя правильно значения из таблицы contragent_tab ?
Неактивен
у вас 2 связи, соответственно 2 соединения
...
join contragent_tab on m.id_contragent=contragent_tab.ID
join contragent_tab_1 on m.id_opponent=contragent_tab_1.ID
...
Неактивен
т.е. нужно еще предварительно создать таблицу contragent_tab_1 ? просто сейчас код сразу не могу проверить?
Неактивен
Нет, создавать не надо, это я торопился и неправильно написал
join contragent_tab on m.id_contragent=contragent_tab.ID
join contragent_tab as contragent_tab_1 on m.id_opponent=contragent_tab_1.ID
...
contragent_tab_1 это синоним contragent_tab
Нужен, так как contragent_tab присоединяется дважды
Неактивен
ок, спасибо. попробую
Неактивен
запрос
join contragent_tab on m.id_contragent=contragent_tab.ID
join contragent_tab as contragent_tab_1 on m.id_opponent=contragent_tab_1.ID
выводит почему то в поле opponent данные поля contragent при этом ID в базе точно разные (посмотрел через phpmyadmin)
Неактивен
А в части select у вас из какой таблицы данные выбираются?
Нужно что-то вроде
select ... contragent_tab.`имя поля`, contragent_tab_1.`имя поля` ...
не знаю как у вас там нужные поля называются.
Неактивен
страшно выглядит, но как то так)
"SELECT m.id, m.timestamp, filial_tab.filial, user_tab.user, viddela_tab.vid, contragent_tab.name, contragent_tab.name, m.object, " &
"m.cena_agents_zap, m.cena_agents_pkd, m.cena_agents_pase, m.zajm, m.avans, status_tab.status, m.comments " &
"FROM main_tab m " &
"join filial_tab on m.id_filial=filial_tab.ID " &
"join user_tab on m.id_user=user_tab.ID " &
"join viddela_tab on m.id_viddela=viddela_tab.ID " &
"join contragent_tab on m.id_contragent=contragent_tab.ID " &
"join contragent_tab as contragent_tab_1 on m.id_opponent=contragent_tab_1.ID " &
"join status_tab on m.status=status_tab.ID "
Неактивен
Вместо
contragent_tab.name, contragent_tab.name,
нужно
contragent_tab.name, contragent_tab_1.name,
Неактивен
А ещё лучше давать осмысленные имена полям,
contragent_tab.name as contragent_name, contragent_tab_1.name as opponent_name,
Неактивен
с as разобрался по предыдущему примеру. Спасибо за подсказку замена на contragent_tab.name, contragent_tab_1.name, помогла!!!
Неактивен
Страниц: 1