Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двойной запрос к одной таблице, Запросить одну табл. по разным критериям 
V
    Опции темы
CaptainNemo
Дата 17.1.2017, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: нет
Всего: 9



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

Код

SELECT * 
    FROM trac, trac_tag, trac_engine, comm_manufacturer, trac_tires
    WHERE trac.id_trac = '$firstElem'
    AND trac.id_trac_tag  = trac_tag.id_trac_tag
    AND trac.trac_power = trac_engine.Engine_Code
    AND trac_tires.id_trac_tires IN (trac.id_trac_tires_front, trac.id_trac_tires_back)
    AND trac.id_comm_manufacturer = comm_manufacturer.id_comm_manufacturer
    AND trac_engine.id_engine_manufacture = comm_manufacturer.id_comm_manufacturer



Мне нужно в одном запросе получить данные из общей таблицы comm_manufacturer (список производителей)
 Первый раз я запрашиваю производителя трактора
Код

AND trac.id_comm_manufacturer = comm_manufacturer.id_comm_manufacturer

А второй раз из этой же таблицы должен получить производителя двигателя этого трактора
Код

AND trac_engine.id_engine_manufacture = comm_manufacturer.id_comm_manufacturer 


Но если я прописываю сразу два этих условия, то ничего не возвращается. Спасибо)

Это сообщение отредактировал(а) CaptainNemo - 17.1.2017, 14:03
PM MAIL WWW ICQ Skype GTalk   Вверх
Akina
Дата 17.1.2017, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20413
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 44
Всего: 449



Раздел называется "Составление SQL-запросов". Так что очистите свой код от PHP-обвязки и замените PHP-подсветку на SQL.


Цитата(CaptainNemo @  17.1.2017,  12:03 Найти цитируемый пост)
если я прописываю сразу два этих условия, то ничего не возвращается

Было бы очень странно, если в таблице нашлась бы запись, у которой comm_manufacturer.id_comm_manufacturer равно одновременно и trac_engine.id_engine_manufacture, и trac.id_comm_manufacturer...

Структуру таблиц с подробными пояснениями, особенно в части связей (а ненужные для дела поля - скрыть или вообще поудалять), а также желаемый результат (с указанием. из какой таблицы какое поле) в студию.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
CaptainNemo
Дата 17.1.2017, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: нет
Всего: 9



Цитата

Было бы очень странно, если в таблице нашлась бы запись, у которой comm_manufacturer.id_comm_manufacturer равно одновременно и trac_engine.id_engine_manufacture, и trac.id_comm_manufacturer...


Я просто хотел узнать, можно ли одним запросом выудить из таблицы comm_manufacturer данные, так, что бы в ответе (массиве) отображалось сначала запись, соответствующая 
Код

trac.id_comm_manufacturer = comm_manufacturer.id_comm_manufacturer

 
а вторым элементом массива запись, для которой
Код

 trac_engine.id_engine_manufacture = comm_manufacturer.id_comm_manufacturer


Такой номер у меня проходит, только когда обращаюсь к группе таблиц, которые связаны между собой по ID
Код

FROM trac, trac_tag, trac_engine, comm_manufacturer, trac_tires

А тут, нужно к одной и той же таблице два раза обратиться  в одном запросе, возможно ли это?


Это сообщение отредактировал(а) CaptainNemo - 17.1.2017, 14:27
PM MAIL WWW ICQ Skype GTalk   Вверх
Akina
Дата 17.1.2017, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20413
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 44
Всего: 449



Цитата(CaptainNemo @  17.1.2017,  15:23 Найти цитируемый пост)
нужно к одной и той же таблице два раза обратиться  в одном запросе, возможно ли это?

Вопрос непонятен. 

Не получается словами - попробуйте минимальным примером показать, что нужно, что ли...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
CaptainNemo
Дата 17.1.2017, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: нет
Всего: 9



Цитата

Не получается словами - попробуйте минимальным примером показать, что нужно, что ли... 


Хорошо, попробую. 

Есть много таблиц в phpmyadmin. Эти таблицы связаны через ID. 
На php у меня написан обработчик, я создаю соединение и отправляю запрос:
Код


SELECT * 
            FROM trac, trac_tag, trac_engine, comm_manufacturer, trac_tires
            WHERE trac.id_trac = '$firstElem'
            AND trac.id_trac_tag  = trac_tag.id_trac_tag
            AND trac.trac_power = trac_engine.Engine_Code
            AND trac_tires.id_trac_tires IN (trac.id_trac_tires_front, trac.id_trac_tires_back)
            AND trac.id_comm_manufacturer = comm_manufacturer.id_comm_manufacturer


В этом запросе только одна внешняя переменная '$firstElem' - индекс элемента таблицы trac. Мне в ответ приходит инфа и из других таблиц 
trac, trac_tag, trac_engine, comm_manufacturer, trac_tires
и эта инфа соответствует переменной '$firstElem'. Ответ приходит в виде вот такого массива

Код

Array ( [0] => 22 [id_trac] => 22 [1] => Deutz-Fahr Agrotron L 720 [trac_mark] => Deutz-Fahr Agrotron L 720 
[2] => http://agropravda.com/assets/uploads/news/e2/f0/d798f-168.jpg [picute_trac_link] => 
 [3] => 5 [id_trac_tag] => 5 [4] => 38 [id_comm_manufacturer] => 6 
[5] => 16.0 [trac_power] => 16.0 [6] => 7700 [trac_mass] => 7700 
[7] => 0.0 [trac_radius] => 0.0 [8] => 0 [trac_mass_front] => 0 
[9] => 0 [trac_mass_back] => 0 [10] => 0 [trac_length] => 0 
[11] => 0 [trac_width] => 0 [12] => 0 [trac_height] => 0 
[13] => 0 [trac_time_eto] => 0 [14] => 0 [trac_time_to] => 0 
[15] => 0 [trac_price] => 0 [16] => 0 [trac_resource] => 0 
[17] => 0000-00-00 [trac_update_date] => 0000-00-00 
[18] => 18 [id_trac_tires_front] => 18 [19] => 15 [id_trac_tires_back] => 15 
[20] => 0 [id_mech_type] => 0 [21] => 0 [id_kansas_man] => 0 [22] => 5 
[23] => 3 [trac_tag_name] => 3 [24] => [trac_tag_description] => [25] => [trac_tag_description1] => 
[26] => 16 [Engine_Code] => 16 [27] => TCD 2013 L06 2V DCR [engine_Name] => TCD 2013 L06 2V DCR 
[28] => 38 [id_engine_manufacture] => 38 [29] => 213,0 [nominal_power] => 213,0 
[30] => 818 [max_torque] => 818 [31] => 1600 [eng_speed] => 1600 
[32] => 7,15 [combuster_volume] => 7,15 [33] => 38 [34] => DEUTZ-FAHR [comm_manufacturer_name] => DEUTZ-FAHR 
[35] => Германия [comm_manufacturer_props] => Германия [36] => [comm_manufacturer_props_bank] => 
[37] => [comm_manufacturer_phone] => [38] => [comm_manufacturer_fax] => [39] => 
[comm_manufacturer_phone_addit] => [40] => [comm_manufacturer_phone_addit1] => 
[41] => [comm_manufacturer_phone_addit2] => [42] => 15 [id_trac_tires] => 15 [43] => 0 [trac_tires_rad] => 0 
[44] => 0 [trac_tires_shir] => 0 [45] => 0 [trac_tires_tt] => 0 [46] => 6 
[47] => 580/70R42 [name_tires] => 580/70R42 )


Из этого массива я собираю сводную таблицу, в которой отображается вся инфа по объекту с индексом '$firstElem'. 
Однако для полноты картины, хотелось бы еще подтянуть в этот массив (приведенный выше) 
еще одну запись, которая соответствовала бы условию            

Код

AND trac_engine.id_engine_manufacture = comm_manufacturer.id_comm_manufacturer 




Это сообщение отредактировал(а) CaptainNemo - 17.1.2017, 15:34
PM MAIL WWW ICQ Skype GTalk   Вверх
Akina
Дата 17.1.2017, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20413
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 44
Всего: 449



Не надо рассказывать, что сделано. Всё равно надо делать "с нуля".

Покажите пример - таблицы с исходными данными и желаемый результат запроса НА ЭТИХ ДАННЫХ.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 18.1.2017, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3470
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(CaptainNemo @ 17.1.2017,  12:03)
Подскажите, у меня вот запрос работает корректно за исключением последней строчки

Код

SELECT * 
    FROM trac, trac_tag, trac_engine, comm_manufacturer, trac_tires
    WHERE trac.id_trac = '$firstElem'
    AND trac.id_trac_tag  = trac_tag.id_trac_tag
    AND trac.trac_power = trac_engine.Engine_Code
    AND trac_tires.id_trac_tires IN (trac.id_trac_tires_front, trac.id_trac_tires_back)
    AND trac.id_comm_manufacturer = comm_manufacturer.id_comm_manufacturer
    AND trac_engine.id_engine_manufacture = comm_manufacturer.id_comm_manufacturer



Мне нужно в одном запросе получить данные из общей таблицы comm_manufacturer (список производителей)
 Первый раз я запрашиваю производителя трактора
Код

AND trac.id_comm_manufacturer = comm_manufacturer.id_comm_manufacturer

А второй раз из этой же таблицы должен получить производителя двигателя этого трактора
Код

AND trac_engine.id_engine_manufacture = comm_manufacturer.id_comm_manufacturer 


Но если я прописываю сразу два этих условия, то ничего не возвращается. Спасибо)

Akina, зачем мучишь хлопца. Ясно же об что он споткнулся.

CaptainNemo, ты можешь использовать в соединении одну и ту же таблицу сколь угодно раз. Для того, чтобы при этом не происходил конфликт имен следует использовать псевдонимы.
Код

SELECT * 
    FROM trac, trac_tag, trac_engine, comm_manufacturer as engine_manufacturer, comm_manufacturer as trac_manufacturer, trac_tires
    WHERE trac.id_trac = '$firstElem'
    AND trac.id_trac_tag  = trac_tag.id_trac_tag
    AND trac.trac_power = trac_engine.Engine_Code
    AND trac_tires.id_trac_tires IN (trac.id_trac_tires_front, trac.id_trac_tires_back)
    AND trac.id_comm_manufacturer = trac_manufacturer.id_comm_manufacturer
    AND trac_engine.id_engine_manufacture = engine_manufacturer.id_comm_manufacturer

Не зная стоящей перед вами задачи, не могу понять, умышленно ли вы используете внутреннее соединение, потому хочется обратить ваше внимание на то, что если хотя бы одно из полей, по которым вы выполняете соединения окажется не заполненным, ваша выборка будет возвращать пустой результат не смотря на то, что все остальные поля заполнены. Если для вашей задачи такое поведение не подходяще, рекомендую обратить внимание на внешнее соединение (конструкция left join)


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Garmahis
Дата 18.1.2017, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: 1
Всего: 4



Конечно в данном случае можно использовать конструкцию LEFT JOIN или UNION. Но сразу предупреждаю что сам формат таблиц и связи между таблицами приведет о очень долгой обработке запроса или таймауту. Я рекомендую вам написать подробнее какие поля в таблице их назначение и как они связаны. Тогда можно будет подсказать как это делать правильно. 
PM   Вверх
CaptainNemo
Дата 18.1.2017, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: нет
Всего: 9



Zloxa
Garmahis, спасибо, теперь все работает)
PM MAIL WWW ICQ Skype GTalk   Вверх
Zloxa
Дата 18.1.2017, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3470
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Garmahis @  18.1.2017,  12:48 Найти цитируемый пост)
сам формат таблиц и связи между таблицами приведет о очень долгой обработке запроса или таймауту

Скажите, пожалуйста, на чем зиждиться это утверждение?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Garmahis
Дата 18.1.2017, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: 1
Всего: 4



Таблица trac по сути набор различных id. Будет очень трудно прописать адекватные индексы.
PM   Вверх
Zloxa
Дата 18.1.2017, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3470
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Garmahis @  18.1.2017,  18:37 Найти цитируемый пост)
Таблица trac по сути набор различных id. Будет очень трудно прописать адекватные индексы. 

Все выглядит как обычная нормализация (возможно очень избыточная). Доступ к trac осуществляется, судя по всему, по первичному ключу. Справочники так же, по всей видимости, подтягиваются по первичным ключам. Другие индексы тут не нужны.

По всей видимости вы имели негативный опыт чего-то другого, но на это похожее, и теперь на молоко дуете. Я даже осмелюсь предположить что вам раньше приходилось сталкиватсься с EAV или ее частностями. Здесь - совсем не то.

Добавлено @ 20:56
смущает, пожалуй только предикат 
Код

trac_tires.id_trac_tires IN (trac.id_trac_tires_front, trac.id_trac_tires_back)

выглядит так, будто может быть получено две строки результата. если оба поля заполнены и различаются, что, скорее всего, не требуется.

Это сообщение отредактировал(а) Zloxa - 18.1.2017, 21:01


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Google
  Дата 23.8.2019, 05:09 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0794 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.