Хитрый SQL запрос в MySQL

Модератор: Модераторы разделов

SatanaClause
Сообщения: 106

Хитрый SQL запрос в MySQL

Сообщение SatanaClause »

Есть одна проблемка, ломаю голову не первый день... Есть две таблицы:

1. Таблица статической информации, которая меняется/добавляется очень редко.

Код: Выделить всё

CREATE TABLE `gs_udb_static` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `group` varchar(255) NOT NULL default '',
  `text` varchar(255) NOT NULL default '',
  `comment` text NOT NULL,
  `status` int(1) default '1',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=19;

INSERT INTO `gs_udb_static` VALUES (1, 'g_NC_speed', '10/100 Mbt/s', '', 1);
INSERT INTO `gs_udb_static` VALUES (2, 'g_NC_speed', '10 Mbt/s', '', 1);
INSERT INTO `gs_udb_static` VALUES (17, 'g_NC_company', 'Compex', '', 1);
INSERT INTO `gs_udb_static` VALUES (4, 'g_WHO', 'Alan Vezhbitskis', '', 1);
INSERT INTO `gs_udb_static` VALUES (5, 'g_WHO', 'Jurij Burlov', '', 1);
INSERT INTO `gs_udb_static` VALUES (6, 'g_WHO', 'Romualdas Jokubavičius', '', 1);
INSERT INTO `gs_udb_static` VALUES (12, 'g_WHERE', 'Mokykla 513', '', 1);
INSERT INTO `gs_udb_static` VALUES (13, 'g_WHERE', 'Mokykla 013', '', 1);
INSERT INTO `gs_udb_static` VALUES (14, 'g_NC_slot', 'ISA', '', 1);
INSERT INTO `gs_udb_static` VALUES (15, 'g_NC_slot', 'PCI', '', 1);
INSERT INTO `gs_udb_static` VALUES (16, 'g_NC_company', 'Realtek', '', 1);
INSERT INTO `gs_udb_static` VALUES (18, 'g_NC_chip', 'RTL8029', '', 1);


2. Таблица сетевых карт

Код: Выделить всё

CREATE TABLE `gs_udb_nc` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `where_id` int(10) default '0',
  `who_id` int(10) default '0',
  `parent_id` int(10) default '0',
  `inv` varchar(255) default '',
  `speed_id` int(10) default '0',
  `slot_id` int(10) default '0',
  `chip_id` int(10) default '0',
  `company_id` int(10) NOT NULL default '0',
  `garantija_id` int(10) default '0',
  `comment` text,
  `status` int(1) default '1',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=3;

INSERT INTO `gs_udb_nc` VALUES (1, 12, 4, 0, 'INV123231', 1, 14, 18, 17, 0, 'bububu', 1);
INSERT INTO `gs_udb_nc` VALUES (2, 12, 6, 0, 'INV0600191P', 1, 15, 18, 16, 0, 'blablabla', 1);

В таблице 2 в полях where_id, who_id, speed_id, slot_id, chip_id и company_id хранятся id из таблицы 1

Надо реализовать простейщую связанную таблицу, тоесть вытащить:

Код: Выделить всё

gs_udb_nc.id,
gs_udb_nc.inv,
gs_udb_static.text (где gs_udb_nc.where_id=gs_udb_static.id,
gs_udb_static.text (где gs_udb_nc.speed_id=gs_udb_static.id,
gs_udb_static.text (где gs_udb_nc.slot_id=gs_udb_static.id,
gs_udb_static.text (где gs_udb_nc.chip_id=gs_udb_static.id,
gs_udb_static.text (где gs_udb_nc.company_id=gs_udb_static.id,
gs_udb_nc.status


Но проблема заключается в том что я использую как конектор между базой и SQL запросом AdoDB (http://adodb.sourceforge.net), а он ,как я понял, не умеет работать с временными таблицами и понимает только стандартный SQL (тоесть который будет одинакого работать и на PosrgresSql и на MySQL ...)

Вместо временной таблицы я решил использовать статическую таблицу (записей будет не так уж и много, гдето 50 таблиц в которых по 500-1000 записей) и из этих 50 таблиц будет выборка гдето в 10, тоесть временных таблиц нужно около 10.

вот пример временной таблицы для gs_udb_nc

Код: Выделить всё

CREATE TABLE `temp_nc` (
  `id` int(10) default '0',
  `inv` varchar(255) default '',
  `where_id` varchar(255) default '',
  `speed_id` varchar(255) default '',
  `slot_id` varchar(255) default '',
  `chip_id` varchar(255) default '',
  `company_id` varchar(255) default '',
  `status` int(1) default '1'
) TYPE=MyISAM;


Но если можно обойтись без нее будет вообще замечательно.
Я люблю людей, люблю когда их нет;
Я бы вышел на болкон, и разрядил бы пистолет!
Спасибо сказали:
Аватара пользователя
mr_Kuzmich
Сообщения: 13

Re: Хитрый SQL запрос в MySQL

Сообщение mr_Kuzmich »

Либо я не догоняю проблемы, либо как-то так:

SELECT
gs_udb_nc.id,
gs_udb_nc.inv,
gs_udb_where.text,
gs_udb_speed.text,
gs_udb_slot.text,
gs_udb_chip.text,
gs_udb_company.text,
gs_udb_nc.status
FROM gs_udb_nc
LEFT JOIN gs_udb_static AS gs_udb_where ON gs_udb_nc.where_id=gs_udb_where.id
LEFT JOIN gs_udb_static AS gs_udb_speed ON gs_udb_nc.speed_id=gs_udb_speed.id
LEFT JOIN gs_udb_static AS gs_udb_slot ON gs_udb_nc.slot_id=gs_udb_slot.id
LEFT JOIN gs_udb_static AS gs_udb_chip ON gs_udb_nc.chip_id=gs_udb_chip.id
LEFT JOIN gs_udb_static AS gs_udb_company ON gs_udb_nc.company_id=gs_udb_company.id
Спасибо сказали:
SatanaClause
Сообщения: 106

Re: Хитрый SQL запрос в MySQL

Сообщение SatanaClause »

Ну что я могу сказать, спасибо тебе, о добрый человек... Я просто основательно запутался в синтаксисе :(

А стыдно то как...

А есть еще какиенибуть вареанты решения этой проблемки? например я пробывал с UNION чтото типо этого...

Код: Выделить всё

SELECT DISTINCT (s.id, s.wh, s.who, s.speed, s.chip, s.company, s.st)

FROM (

--- where

SELECT n.id id,s.text wh,null who, null speed,null chip, null company,
n.status st

FROM nc n, static s

WHERE n.where_id=s.id

union

--- who

SELECT n.id id,null wh,s.text who, null speed,null chip, null company,
n.status st

FROM nc n, static s

WHERE n.who_id=s.id

union

--- speed

SELECT n.id id,null wh,null who, s.text speed,null chip, null company,
n.status st

FROM nc n, static s

WHERE n.speed_id=s.id

union

--- chip

SELECT n.id id,null wh,null who, null speed, s.text chip, null company,
n.status st

FROM nc n, static s

WHERE n.chip_id=s.id

union

--- company

SELECT n.id id,null wh,null who, null speed, null chip, s.text company,
n.status st

FROM nc n, static s

WHERE n.company_id=s.id

) S
Я люблю людей, люблю когда их нет;
Я бы вышел на болкон, и разрядил бы пистолет!
Спасибо сказали:
Аватара пользователя
sarutobi
Сообщения: 676
Статус: Добрость и скромнота
ОС: Debian 5, FreeBSD 6.2/8.0

Re: Хитрый SQL запрос в MySQL

Сообщение sarutobi »

Гм, а разницу между Join и Union мы понимаем?
Fire and water, earth and sky - mistery surrounds us, legends never die!
Спасибо сказали:
SatanaClause
Сообщения: 106

Re: Хитрый SQL запрос в MySQL

Сообщение SatanaClause »

Думаю что да, Union обеъдиняет запросы а Join какбы выполняет запрос в запросе
Я люблю людей, люблю когда их нет;
Я бы вышел на болкон, и разрядил бы пистолет!
Спасибо сказали:
Аватара пользователя
sarutobi
Сообщения: 676
Статус: Добрость и скромнота
ОС: Debian 5, FreeBSD 6.2/8.0

Re: Хитрый SQL запрос в MySQL

Сообщение sarutobi »

SatanaClause писал(а):
30.10.2006 16:38
Думаю что да, Union обеъдиняет запросы а Join какбы выполняет запрос в запросе

Курим мануал на предмет того как объединяются таблицы (join) и результаты выполнения нескольких запросов (Union) :)
Fire and water, earth and sky - mistery surrounds us, legends never die!
Спасибо сказали:
SatanaClause
Сообщения: 106

Re: Хитрый SQL запрос в MySQL

Сообщение SatanaClause »

sarutobi писал(а):
30.10.2006 16:45
Курим мануал на предмет того как объединяются таблицы (join) и результаты выполнения нескольких запросов (Union) :)

Этим я и занимаюсь... Спасибо за помощь!
Я люблю людей, люблю когда их нет;
Я бы вышел на болкон, и разрядил бы пистолет!
Спасибо сказали: