SELECT U.*, S.*
FROM `user` AS U
LEFT JOIN stats AS S ON S.user_id = U.id
WHERE U.id = 1
SELECT u.*, MAX(s.date) max_date
FROM user u
LEFT JOIN stats s
ON s.user_id = u.id
WHERE u.id = 1
GROUP BY u.id
Делать 4 таблицы (коммент запроса, похожие фильмы запроса, коммент ответа, фильмы ответа) не очень хочется во нескольким причинам:
слишком много запросов в БД будет на получение списка запросов на просмотр (запрос, фильмы, кто, что советует)
слишком много лишних телодвижений будет и при ответеЧто значит слишком много? По сравнению с чем?
Вообще, 4 таблицы — это будет нормализированный способ хранения ваших данных. Можно и денормализировать, но это ухудшит расширяемость и возможности по манипуляци данными средствами SQL. Иногда денормализация приемлема, просто нужно в полной мере осознавать, какими будут последствия.
Например, можно сделать две таблицы: Comments и CommentMovies. В Comments добавить поле IsQuestion, в котором хранить TRUE, если это вопрос и FALSE, если это ответ. CommentMovies будет хранить фильмы как для вопросов, так и для ответов.
Минусом такого подхода будут проблемы функциональной расширяемости. То есть, если вы захотите добавить в таблицу Comments поле, присущее только вопросам, то у вас будет, по сути, три пути:
1) Рефакторинг структуры: разделение на ваши исходные 4 таблицы. Это трудозатратно;
2) Добавление ещё одной таблицы: QuestionCommentFields. Структура получается корявой;
3) Создание поля, которое будет хранить значения только для одного типа строк. Это уже денормализация.
Можно фильмы хранить в виде строки в основной таблице, перечисленными через запятую. Это денормализация, она упростит структуру, но усложнит и замедлит изменение и поиск данных.
В общем, выделите для себя какие-то приоритеты и путеводные камни. Будет ли структура часто меняться в будущем, важна ли простота поддержки? Важна ли скорость выполнения запросов, важна ли возможность менять данные напрямую SQL'ем? И т.п.
SELECT Id, translate(Value), translate(Value2) ...
как от этого избавиться?Я не думаю, что от этого стоит (или даже можно) избавляться. Вреда никакого, одна сплошная польза :)
CREATE TABLE im_goods_new (
id int(10) unsigned zerofill NOT NULL auto_increment,
name varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
INSERT INTO im_goods_new
SELECT DISTINCT name_goods
FROM im_goods;
INSERT INTO im_goods_sections (id_goods, id_section)
SELECT DISTINCT new.id, old.id_section
FROM im_goods_new new
JOIN im_goods old
ON new.name = old.name_goods;
DROP TABLE im_goods;
RENAME TABLE im_goods_new TO im_goods;
DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_test`$$
CREATE DEFINER=`user`@`%` PROCEDURE `sp_test`(
IN Number INT
)
READS SQL DATA
BEGIN
--
-- Код здесь
--
END$$
DELIMITER ;