Mysql Сложный запрос MYSQL с использованием IF

Bebek

Guest
Привет!

Есть таблица:

ID | ACTION | CAR | VELO | USER

Данные в ней:

1 | МАШИНА | ID# МАШИНЫ | _______ | USERNAME
2 | ВЕЛОСИПЕД | _____ | ID# ВЕЛОСИПЕДА | USERNAME

Есть также три таблица, USERS, VELOS и CARS.

ВОзможно еще при запуске таблицы определять, например я знаю с left join можно выбрать из двух таблиц у которых совпадает значение, а тут сложнее: при выводе надо учитывать ACTION, если это ВЕЛОСИПЕД то left join делать с таблицей VELOS учитывая поле VELO как id, если это МАШИНА то с CARS учитывая поле CAR как id машины + к этому с таблицы USERS брать инфу....

МНе не только создать это сложно но и объяснить :) Но я надеюсь вы меня поняли....

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

Bebek

Guest
Вот понял правильное формулирование вопроса!))))

ИСХОДЯ ОТ ЗНАЧЕНИЯ ACTION ПОДЗАПРОС МОЖЕТ ИДТИ К РАЗНЫМ ТАБЛИЦАМ
 

Redjik

Джедай-мастер
1) это лучше делать на php
2) нафиг тебе разные таблицы тогда - сделай одну с полем enum - тип транспорта
 

Bebek

Guest
1, если делать на php, это я сам смогу и это для меня в 100 раз легче, но придется же много раз использовать sql запрос?
2. я не понял о чём ты...

смотри, это для ленты событий...
1. ЮЗЕР подписался на вашу машину БМВ
2. У вашей машины БМВ новые комментарии
3. На странице МЕРСЕДЕС где вы оставляли комментарии новые комментарии
4. ЮЗЕР считат запись бортового журнала БМВ классной
5. Под новостью # где вы участвовали новые комментарии


и еще несколько такого рода событий должна себе хранить база


Видишь как разнообразные данные? Как их можно сделать?((((

Я думал о том что бы у каждой записи был свой ACTION и уже по нему выбирать из таблицы новости, форума или машины заголовок....
 

Redjik

Джедай-мастер
item has_many comments
user many_many subscriptions (user_id,model,item_id)
user has_many messages

Когда какому то item кто-то оставляет комментарий, он автоматически добавляется в подписку (subscription), те кто имеют подписку, получают message, который дублируется на почту...
В упор не вижу тех извратов, которые ты описал
 
  • Like
Реакции: WMix

WMix

герр M:)ller
Партнер клуба
Bebek
ужасный подход, но если так хочешь....

PHP:
CREATE TABLE IF NOT EXISTS `a` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  `unused` date NOT NULL,
  PRIMARY KEY (`id`)
) ;

INSERT INTO `a` (`id`, `name`, `unused`) VALUES
(1, 'aaa 1', '2013-01-09');

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `b` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  `unused` text NOT NULL,
  PRIMARY KEY (`id`)
) ;


INSERT INTO `b` (`id`, `name`, `unused`) VALUES
(1, 'bbb', 'hello');

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `c` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  `unused` enum('x','y','z') NOT NULL,
  PRIMARY KEY (`id`)
) ;

INSERT INTO `c` (`id`, `name`, `unused`) VALUES
(1, 'ccc 1', 'y'),
(2, 'ccc2', 'z');

-- --------------------------------------------------------


CREATE TABLE IF NOT EXISTS `main` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `table_name` varchar(25) NOT NULL,
  `pid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `table_name` (`table_name`,`pid`)
) ;

INSERT INTO `main` (`id`, `table_name`, `pid`) VALUES
(1, 'a', 1),
(2, 'b', 1),
(3, 'c', 1),
(4, 'c', 2);

-- --------------------------------------------------------

select 
	m.id,
	if( m.table_name = 'a', a.name, if(m.table_name = 'b', b.name, if(m.table_name = 'c', c.name, NULL))) as name
from main m
left join a on  m.pid = a.id
left join b on  m.pid = b.id
left join c on  m.pid = c.id
Код:
+----+-------+
| id | name  |
+----+-------+
|  1 | aaa 1 |
|  2 | bbb   |
|  3 | ccc 1 |
|  4 | ccc2  |
+----+-------+
 
Сверху