SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.01.2014 02:36:34

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Помогите новичку сформировать правильный запрос SELECT * FROM

Приветствую всех!
Имеется основная таблица

"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, у которой имеется собственная ссылка.
Заранее благодарен в помощи!!!

Неактивен

 

#2 23.01.2014 05:00:38

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

eip написал:

обычный SELECT * FROM `main_tab` выводит только номера ID ссылок, вместо текста.
так вот, основной вопрос заключается в том, как реализовать запрос, что бы вывести строки таблицы main_tab, у которой должны быть заполнены все ссылки, в том числе и из таблицы  status_set_log, у которой имеется собственная ссылка.
Заранее благодарен в помощи!!!

NOT NULL в определении полей и так гарантирует вам, что заполнены все ссылки. Если нужен текст вместо id, то используйте JOIN
Если я не правильно вас понял, то приводите тестовый набор данных и желаемый на нем результат.

Неактивен

 

#3 23.01.2014 10:25:47

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

я имею ввиду, то что 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

Неактивен

 

#4 23.01.2014 10:33:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

используйте join
select filial from main_tab join filial_tab on id_filial=filial_tab.ID;

Неактивен

 

#5 23.01.2014 20:59:07

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

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 не мой конек))) но очень надо

Неактивен

 

#6 23.01.2014 21:03:59

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

и непонятен такой момент JOIN используется для создания внешнего объединения таблиц, а
SELECT FROM используется для внутреннего объединения
учитывая что у меня прописаны REFERENCES разве я не могу использовать запрос SELECT FROM без JOIN ?
или я что то путаю?

Неактивен

 

#7 23.01.2014 21:11:17

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

перечислить все поля, т.е.


select m.id, m.`timestamp`, filial_tab.filial, user_tab.`коечное поле из таблицы user_tab`
from main_tab m join filial_tab on m.id_filial=filial_tab.ID
join user_tab on m.id_user=user_tab.ID;


и так далее аккуратно написав этого монстра. Пишите его постепенно, проверяя результат после добавления каждой новой таблицы.

Неактивен

 

#8 23.01.2014 21:14:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

eip написал:

и непонятен такой момент JOIN используется для создания внешнего объединения таблиц, а
SELECT FROM используется для внутреннего объединения
учитывая что у меня прописаны REFERENCES разве я не могу использовать запрос SELECT FROM без JOIN ?
или я что то путаю?

select from это просто выборка
join это внутреннее объединение

Посмотрите этот пост, там очень хорошо расписано.

Неактивен

 

#9 23.01.2014 23:51:22

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

отлично! Ваш пример меня спас, только остался один маленький нюанс если я добавляю поле запрос к status_set_log_tab, которая ссылается на status_tab, то возникает ошибка. может status_set_log_tab как то предварительно сформировать надо?

Неактивен

 

#10 24.01.2014 11:47:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

Приводите запрос и ошибку. Подозреваю, что вам нужно

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

Неактивен

 

#11 17.02.2014 01:21:33

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

Прописал я вот такую штуку

("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 ?

Неактивен

 

#12 17.02.2014 12:23:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

у вас 2 связи, соответственно 2 соединения

...
join contragent_tab on m.id_contragent=contragent_tab.ID
join contragent_tab_1 on m.id_opponent=contragent_tab_1.ID
...

Неактивен

 

#13 17.02.2014 12:53:17

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

т.е. нужно еще предварительно создать таблицу contragent_tab_1 ? просто сейчас код сразу не могу проверить?

Неактивен

 

#14 17.02.2014 12:57:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

Нет, создавать не надо, это я торопился и неправильно написал


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 присоединяется дважды

Неактивен

 

#15 17.02.2014 13:17:51

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

ок, спасибо. попробую

Неактивен

 

#16 17.02.2014 22:30:20

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

запрос
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)

   
http://i024.radikal.ru/1402/ba/6ef6ee65df1f.jpg

Неактивен

 

#17 17.02.2014 22:45:48

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

А в части select у вас из какой таблицы данные выбираются?

Нужно что-то вроде
select ... contragent_tab.`имя поля`, contragent_tab_1.`имя поля` ...
не знаю как у вас там нужные поля называются.

Неактивен

 

#18 17.02.2014 22:49:18

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

страшно выглядит, но как то так)

"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 "

Неактивен

 

#19 17.02.2014 22:51:15

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

Вместо
contragent_tab.name, contragent_tab.name,
нужно
contragent_tab.name, contragent_tab_1.name,

Неактивен

 

#20 17.02.2014 22:53:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

А ещё лучше давать осмысленные имена полям,
contragent_tab.name as contragent_name, contragent_tab_1.name as opponent_name,

Неактивен

 

#21 17.02.2014 22:56:17

eip
Участник
Зарегистрирован: 23.01.2014
Сообщений: 11

Re: Помогите новичку сформировать правильный запрос SELECT * FROM

с as разобрался по предыдущему примеру. Спасибо за подсказку замена на contragent_tab.name, contragent_tab_1.name, помогла!!!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson