запрос из нескольких таблиц mysql

733
04 сентября 2017, 07:18

есть таблицы mysql:

|------
|Столбец|Тип|Null|По умолчанию
|------
|//**id**//|int(11)|Нет|
|parent_id|int(11)|Нет|0
|title|varchar(255)|Нет|
|description|varchar(255)|Нет|
|keywords|varchar(255)|Нет|
|category_img|varchar(255)|Нет|
|seo|varchar(255)|Нет|

|---

---
|Столбец|Тип|Null|По умолчанию
|------
|//**id**//|int(11)|Нет|
|id_user|int(11)|Нет|
|id_category|int(11)|Нет|
|id_town|int(11)|Нет|
|id_region|int(11)|Нет|
|id_street|int(11)|Нет|
|home_post|varchar(255)|Нет|
|id_album|int(11)|Нет|0
|id_news|int(11)|Нет|0
|title|varchar(255)|Нет|
|title_seo|varchar(255)|Нет|
|descriotion|varchar(255)|Нет|
|img_company|varchar(255)|Нет|
|house|varchar(32)|Нет|
|text|text|Нет|
|schedule|varchar(255)|Нет|
|pause|varchar(255)|Нет|
|day_off|varchar(255)|Нет|
|contacts|varchar(255)|Нет|
|email_company|varchar(255)|Нет|
|url_company|varchar(255)|Нет|
|valid_status|int(1)|Нет|0
|------
|Столбец|Тип|Null|По умолчанию
|------
|//**id**//|int(11)|Нет|
|id_town|int(11)|Нет|
|name|varchar(32)|Нет|
== Дамп данных таблицы region
|Столбец|Тип|Null|По умолчанию
|------
|//**id**//|int(11)|Нет|
|id_company|int(11)|Нет|
|id_user|int(11)|Нет|
|title|varchar(255)|Нет|
|text|text|Нет|
|reiting|int(11)|Нет|
== Дамп данных таблицы rewards

|------
|Столбец|Тип|Null|По умолчанию
|------
|//**id**//|int(11)|Нет|
|name|varchar(32)|Нет|
|lastname|varchar(32)|Нет|
|secondname|varchar(32)|Нет|
|user_type|varchar(2)|Нет|
|login|varchar(32)|Нет|
|pass|varchar(32)|Нет|
|about|text|Нет|
|user_img|varchar(255)|Нет|
|contacts|varchar(255)|Нет|
|id_town|int(11)|Нет|
|id_region|int(11)|Нет|
|id_street|int(11)|Нет|
|home|varchar(32)|Нет|
|email|varchar(64)|Нет|
|link|varchar(255)|Нет|
|link2|varchar(255)|Нет|
|date_registration|varchar(14)|Нет|
|online_status|tinyint(1)|Нет|0
|valid_status|tinyint(4)|Нет|
== Дамп данных таблицы users

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

Answer 1
SELECT
      `rewards`.*,
      `users`.`id` as `id`,
      `category`.`id` AS `id_category`,
      `users`.`name` as `user_name`,
      `users`.`last_name` as `user_last_name`,
      `company`.`title` AS `company_name`,
      `category`.`title` AS `category_name`,
      `town`.`name` AS `town_name`
  FROM 
    `rewards`
  LEFT JOIN `users` ON (`users`.`id` = `rewards`.`id_user`)
  LEFT JOIN `company` ON (`company`.`id` = `rewards`.`id_company`)
  LEFT JOIN `category` ON (`category`.`id` = `company`.`id_category`)
  LEFT JOIN `town` ON (`town`.`id` = `company`.`id_town`)
  WHERE 
      {$ВАШЕ_УСЛОВИЕ}
  GROUP BY
    `rewards`.`id` 

попробуйте такой вариант, запрос выведет отзывы о компаниях.

Если

$ВАШЕ_УСЛОВИЕ = '`rewards`.`id_company` = 1'

то вы получите все отзывы о компании с ID 1

Answer 2

Самый простой и понятный способ - это субзапросы (в таблицы region, rewards и т.д.) по каждой строчке из таблицы с компаниями. Сюда же подойдут запросы с JOIN, хотя они плохо приспособлены под масштабирование данных и для новичков менее понятны.

Наиболее оптимальный вариант - последовательный запрос данных в каждой из таблиц с последующим их сопоставлением:

  1. Выполняем запрос в таблицу с компаниями. Собираем id для субзапросов.

    SELECT * FROM companies WHERE ...;
    
  2. Выполняем субзапрос со всеми найденными ранее id в таблицу region, rewards и т.д.

    SELECT * FROM region WHERE id_town=$1 OR id_town=$2 OR ...;
    
  3. Выполняем сопоставление данных из основной таблицы с компаниями и данных, полученных из субзапросов.

В этом случае мы не посылаем в базу множество запросов и структура SQL-данных хорошо приспособлена под будущее масштабирование.

READ ALSO
Php curl запрос через прокси с авторизацией

Php curl запрос через прокси с авторизацией

Помогите, кто знает, вот функция:

9224
Загрузить PDF из php rest api

Загрузить PDF из php rest api

php rest api генерирует PDF в виде blob, как получить файл на фронтенде без сохранения на сервереМое решение

697
Wordpress. Вставка html кода в поле виджета

Wordpress. Вставка html кода в поле виджета

Решил написать свой виджет для wordpress, но столкнулся с проблемойСтандартные поля типа text/textarea при сохранении удаляют все html тэги

650
SMTP почта с Phpmailer

SMTP почта с Phpmailer

session_cache_limiter('nocache'); header('Expires: 'gmdate('r', 0));

790