@andreyabc

JOIN из двух таблиц?

есть 3 таблицы:
CREATE TABLE IF NOT EXISTS `workout` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `trainer` int(11) NOT NULL COMMENT 'тренер',
  `client` int(11) NOT NULL COMMENT 'клиент',
  `gym` int(11) NOT NULL COMMENT 'зал',
  `year` int(11) NOT NULL COMMENT 'год',
  `month` int(11) NOT NULL COMMENT 'месяц',
  `day` int(11) NOT NULL COMMENT 'число',
  `sttime` varchar(5) NOT NULL COMMENT 'время начала',
  `entime` varchar(5) NOT NULL COMMENT 'время окончания',
  PRIMARY KEY (`id`),
  KEY `trainer` (`trainer`),
  KEY `client` (`client`),
  KEY `gym` (`gym`),
  KEY `year` (`year`),
  KEY `month` (`month`),
  KEY `day` (`day`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;


CREATE TABLE IF NOT EXISTS `trainers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL COMMENT 'ФИО тренера',
  `phone` varchar(12) NOT NULL COMMENT 'номер телефона',
  `spec` text NOT NULL COMMENT 'специализация',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;


CREATE TABLE IF NOT EXISTS `trainers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL COMMENT 'ФИО тренера',
  `phone` varchar(12) NOT NULL COMMENT 'номер телефона',
  `spec` text NOT NULL COMMENT 'специализация',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;


запрос, выбирающий из таблицы `workout` тренировки на сегодня:
SELECT `workout`.`trainer`, `workout`.`client`, `workout`.`sttime`, `workout`.`entime`
FROM `workout`
WHERE `workout`.`day`=(SELECT `days`.`id` FROM `days` WHERE `days`.`dayname`=DAYOFMONTH(NOW()))
AND `workout`.`month`=(SELECT `months`.`id` FROM `months` WHERE `months`.`id`=MONTH(NOW()))
AND `workout`.`year`=(SELECT `years`.`id` FROM `years` WHERE `years`.`yearname`=YEAR(NOW()))
ORDER BY `workout`.`sttime`


в результате получаю id клиентов и тренеров, подскажите, пожалуйста, как вывести их имена из соотв. таблиц?
  • Вопрос задан
  • 2248 просмотров
Решения вопроса 1
Dremkin
@Dremkin
1.
SELECT w.*, 
        t.name as trainer_name,
        c.name as client_name
FROM workout w
INNER JOIN trainers t ON t.id = w.trainer
INNER JOIN clients c ON c.id = w.client
WHERE w.day = DAYOFMONTH(NOW())
    AND w.month = MONTH(NOW())
    AND w.year = YEAR(NOW())


2. Линчевать того программиста, который придумал структуру для первой таблицы.
3. Все поля дат убрать. Добавить два новых: "Дата С" и "Дата По", оба datetime.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@AlexeyIvanov
Developer
Думаю для начала необходимо ознакомится с документацией.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Я так понимаю, что дата у Вас выводится в виде "день, когда мне дорогу перешёл чёрный кот, месяца возвращения с юга журавлей, третьего года династии Цинь". Иначе непонятно, почему не использовался стандартный тип DATE и зачем нужны таблицы `days`, `months`, `years`. Для времени тоже есть стандартное поле - TIME, ни к чему хранить его в VARCHAR.
А присоединение таблиц - LEFT JOIN
SELECT `w`.`gym`, `t`.`name`, `c`.`name`, `w`.`sttime`, `w`.`entime`
    FROM `workout` AS `w`
    LEFT JOIN `trainers` AS `t` ON `t`.`id` = `w`.`trainer`
    LEFT JOIN `clients` AS `c` ON `c`.`id` = `w`.`client`
    WHERE `w`.`date` = CURDATE()
    ORDER BY `w`.`sttime`
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы