MySQL - Как правильно связать таблицы?

207
07 апреля 2018, 20:59

Есть 2 таблицы - посты и комментарии к ним:

**oc_blog**
| blog_id | date_added | count_read |
| 1       | 04.04.18   | 10         |
| 2       | 05.04.18   | 2          |
| 3       | 06.04.18   | 5          |
| 4       | 07.04.18   | 1          |
**oc_blog_comment**
| blog_id | date_added | comment |
| 1       | 05.04.18   | blabla  |
| 3       | 05.04.18   | blabla  |

Связываю их таким запросом

$sql = "SELECT * FROM " .
  DB_PREFIX . "blog i
  LEFT JOIN " . DB_PREFIX . "blog_description id ON (i.blog_id = id.blog_id)
  LEFT JOIN " . DB_PREFIX . "blog_to_store i2s ON (i.blog_id = i2s.blog_id)
  LEFT JOIN " . DB_PREFIX . "blog_comment ic ON (i.blog_id = ic.blog_id)
WHERE
  id.language_id = '" . (int)$this->config->get('config_language_id') . "' AND
  i2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND
  i.status = '1' AND
  i.sort_order <> '-1'";

Выборку потом делаю $sql .= " ORDER BY comment DESC, i.blog_id LIMIT " . (int)$start . "," . (int)$limit;

Но при этом, выдаются даты постов 01.01.1970. Как я понимаю, это в результате того, что постам из первой таблицы присваиваются даты размещения комментариев - из второй таблицы, а недостающие забиваются нулями.

Вопрос - как правильно их связать, чтоб даты комментариев не замещали даты постов?

Это модуль Opencart`a. Данный файл - модель, он делает запрос в базу (запрос написал выше) и затем передает контролеру:

$query = $this->db->query($sql);
return $query->rows;

Контролер потом разбирает этот ответ. В частности, дата берется так:

'date_added_full' => date(
  $this->language->get('date_format_short'),
  strtotime($result['date_added'])
) 
Answer 1

Проблема в том, что у Вас в двух таблицах есть поле с именем date_added и обращаясь к полю как $result['date_added'] Вы обращаетесь к полю другой таблицы.

Решение проблемы, в выборке дать полям различные имена

$sql = "SELECT
  i.`date_added` AS `post_date`,
  ic.`date_added` AS `comment_date`
FROM " .
  DB_PREFIX . "blog i
  LEFT JOIN " . DB_PREFIX . "blog_description id ON (i.blog_id = id.blog_id)
  LEFT JOIN " . DB_PREFIX . "blog_to_store i2s ON (i.blog_id = i2s.blog_id)
  LEFT JOIN " . DB_PREFIX . "blog_comment ic ON (i.blog_id = ic.blog_id)
WHERE
  id.language_id = '" . (int)$this->config->get('config_language_id') . "' AND
  i2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND
  i.status = '1' AND
  i.sort_order <> '-1'";
'date_added_full' => date(
  $this->language->get('date_format_short'),
  strtotime($result['post_added'])
) 

Или, если второе поле не нужно, не выбирать его.

А самое главное - НИКОГДА не использовать конструкцию SELECT * FROM! Всегда указывать список конкретных полей, которые нужно выбрать, даже если этих полей десятки. На одни грабли, связанные с этой конструкцией, Вы уже наступили. Поверьте, есть еще и не одни

READ ALSO
объединить поля по древовидной выборке

объединить поля по древовидной выборке

Данным запросом, получаю дерево категорий, но есть еще столбец code, как на базе данного запроса, получить только объединенную строку code в порядке...

166
В mysql вместо NULL в таблице появляются нули

В mysql вместо NULL в таблице появляются нули

Вот таким кодом я изменил дефолтное значение в mysql:

204
Форма в symfony не оптравляет запрос

Форма в symfony не оптравляет запрос

Работаю над тем, чтобы поддерживать очень старую фрейм-структуру, и теперь настало время ее обновить, чтобы поддержать композер и symfony-формы

201
Положил сервак используя exec()

Положил сервак используя exec()

Написал скрипт, который автоматически будет определять робота и на лету делать для него снапшот страницыНаписал код в php, который проверяет,...

228