2012-02-10 4 views
1
Table: Unit 
ID NAME VALUE 
1 Kilo 1000 
2 Mega 1000000 
3 Giga 1000000000 

Table: Storage 
ID Title Drive_value DriveUnitID Cache_value CacheUnitID Status_ID error error_unit area 
1 Seagate 100   3   400   1   2   1  1   1 
2 Scansoft 250   3   80   2   1   1  2   2 

Table: manufac 
    ID area 
    1 US 
    2 CHINA 

Table: Status 
ID Description 
1 Blah.. Blah 
2 Durka Durka 

Желаемая цель состоит в том, чтобы иметь подвыбор соединяющий три таблицы что-то вроде этого (ниже), но этот синтаксис не работаетВ mysql как добавить еще одно соединение таблицы в подзапрос?

select 
s.title, 
t.description, 
x.area, 
u1.value * s.cache_value as Cache, 
u2.value * s.drive_value as Drive, 
u3.value * s.error_value as Error 
((u4.value * s.error_value)+(u4.value * s.error_value)) as ErrorHigh 
((u5.value * s.error_value)-(u5.value * s.error_value)) as ErrorHigh 
from storage s 
join status t on t.id = s.status_id 
join manufac x on x.id = s.manufac_id 
join unit u1 on s.cache_unit_id = u1.id 
join unit u2 on s.drive_unit_id = u2.id 
join unit u3 on s.error_unit_id = u3.id 
join unit u4 on s.error_unit_id = u4.id 
join unit u5 on s.error_unit_id = u5.id 
+1

Ваш запрос не имеет хорошего синтаксиса. 'INNER JOIN Status.ID ON t.ID'. Что это? – DonCallisto

ответ

1

Эти запросы семантически то же самое. Но помните, как вы положили на стол в соединении или в ЕКЕ:

С явным присоединяетесь:

select s.title, t.description, 
u1.value * s.cache_value as Cache, 
u2.value * s.drive_value as Drive 
from storage s 
join status t on t.id = s.status_id 
join unit u1 on s.cache_unit_id = u1.id 
join unit u2 on s.drive_unit_id = u2.id 

С неявным присоединяется:

select s.title, t.description, 
u1.value * s.cache_value as Cache, 
u2.value * s.drive_value as Drive 
from storage s, status t, unit u1, unit u2 
where t.id = s.status_id and s.cache_unit_id = u1.id and s.drive_unit_id = u2.id 

Конечный результат то же для конечный пользователь и СУБД также обрабатывают оба запроса одинаково, поэтому при использовании одного или другого прироста производительности нет.

Edit:

После требований изменили это запрос, я думаю, что вы ищете:

select s.title, t.description, 
u1.value * s.cache_value as Cache, 
u2.value * s.drive_value as Drive, 
u3.value * s.error_value as Error, 
u3.value * s.error_value * 2 as ErrorHigh, 
u3.value * s.error_value - u3.value * s.error_value as ErrorLow, 
m.area 
from storage s 
join status t on t.id = s.status_id 
join manufac m on m.id = s.area 
join unit u1 on s.cache_unit_id = u1.id 
join unit u2 on s.drive_unit_id = u2.id 
join unit u3 on s.error_unit_id = u3.id 

Example

Результат:

+----------+-------------+----------+--------------+---------+-----------+----------+-------+ 
| TITLE | DESCRIPTION | CACHE | DRIVE  | ERROR | ERRORHIGH | ERRORLOW | AREA | 
+----------+-------------+----------+--------------+---------+-----------+----------+-------+ 
| Seagate | Durka Durka | 400000 | 100000000000 | 1000 |  2000 |  0 | US | 
| Scansoft | Blah.. Blah | 80000000 | 250000000000 | 1000000 | 2000000 |  0 | CHINA | 
+----------+-------------+----------+--------------+---------+-----------+----------+-------+ 
  • Обратите внимание, что в вашем вопросе есть два столбца с именем ErrorHigh.
  • Math "errors" x + x = 2 * x (где x = u4.value * s.error_value)
  • Возможно, наихудшая математическая ошибка :) x - x = 0 (где x = u5.value * s .error_value)

Поэтому я предполагаю, что этот запрос не то, что вам действительно нужно, но должно быть достаточно, чтобы привести вас в правильном направлении. Удачи!

+0

Я получаю те же результаты, которые отображаются 3 раза – stackoverflow

+1

Это должна быть проблема с данными. Проверьте это [ссылка] (http://sqlfiddle.com/#!2/41f34/17). Обновите свой вопрос с данными, которые дублируются для отслеживания проблемы. –

+0

@MOstly Mostacho Я изменил оригинал, если вы могли бы взглянуть. Я положил его в скрипт msql, но я не сохранил – stackoverflow

3

проверить ваш запрос, третьи внутреннее соединение не имеет состояния. И вам не нужно включать Status в ваш FROM пункт, если вы собираетесь на INNER JOIN!

SELECT 
s.Title, 
t.Description, 
u1.VALUE * s.Drive_value AS Drive, 
u2.VALUE * s.Cache_value AS Cache 
FROM Storage s 
INNER JOIN Unit u1 ON u1.ID = s.DriveUnitID 
INNER JOIN Unit u2 ON u2.ID = s.CacheUnitID 
INNER JOIN Status t ON t.ID = s.Status_ID; 
+0

@ Маттен должен быть ОТ Хранения s, Статус p? мне нужно добавить переменную после этой таблицы, следовательно, 'p' – stackoverflow

+0

Это все еще не работает. Я получаю неизвестный столбец в статье ошибка – stackoverflow

+1

Нет, это прекрасно, как я писал. Не добавляйте 'Status' в предложение' FROM'. Где вы получаете сообщение об ошибке? – Matten

Смежные вопросы