SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.03.2013 23:05:37

Dmitriy88
Участник
Зарегистрирован: 21.03.2013
Сообщений: 9

помогите с соединением множества таблиц в операторе select

Здравствуйте, уважаемые форумчане. Столкнулся с такой вот проблемой при разработке БД. Имеется одна дочерняя таблица Orders в которую сливаются все данные из 10 родительских таблиц (например таблица с размерами Sizes). Сложности возникли при попытке объединения таблиц. Мне необходимо вывести все данные из таблицы Orders. Так как в дочерней таблице представлены внешние ключи , а мне нужно их значение из родительской таблицы я применяю

SELECT * FROM Orders INNER JOIN USING (SizeID)
, и это работало раньше, когда в таблице Orders было одноименное поле с именем SizeID. В результате, вместо внешнего ключа в таблице Orders появлялось конкретное значение, соответствующее этому ключу.

Сейчас базу расширил и теперь в таблице Orders содержится два поля SizeLEFT и SizeRIGHT которые также с помощью внешнего ключа связаны с таблицей Sizes (она не менялась). Загвоздка в том что USING в объединении не получается использовать по причине несоответствия имен столбцов, а запрос вида
SELECT * FROM Orders AS o INNER JOIN Sizes AS s ON o.SizeLEFT=s.SizeID AND o.SizeRIGHT=s.SizeID
приводит к тому что мне возвращаются в результате внешние ключи, а не значения, соответствующие этим ключам!!! Какой должен быть запрос чтобы в итоге в столбце SizeLEFT и SizeRIGHT были значения ключей? Помогите пожалуйста, очень нужна помощь!!! Не создавать же изза этого две таблицы с размерами вместо одной.

Неактивен

 

#2 22.03.2013 12:24:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите с соединением множества таблиц в операторе select

Вместо * явно указать нужные вам поля. Так кстати, лучше делать всегда.

SELECT ..., s.SizeID as SizeLEFT, ...

Неактивен

 

#3 22.03.2013 13:47:53

Dmitriy88
Участник
Зарегистрирован: 21.03.2013
Сообщений: 9

Re: помогите с соединением множества таблиц в операторе select

Ну по поводу указывания нужных полей в запросе, это ясное дело :-), я для экономии места просто поставил *. Хотя теперь понимаю что меня интересует вопрос по поводу того какие столбцы указывать в операторе  SELECT. vasya, спасибо что откликнулись, но я всеравно не понял как объединить таблицы((.


Запрос по вашей подсказке приводит к темже результатам:
select s.SizeID as SizeLEFT from Orders AS o JOIN Sizes AS s ON o.SizeLEFT=s.SizeID AND o.SizeRIGHT=s.SizeID;
+----------+
| SizeLEFT |
+----------+
| s42      |
| s38      |
+----------+

Но, как я уже сказал, не совсем разобрался что и где указывать для подобного объединения.
Для прояснения ситуации, таблица Sizes выглядит следующим образом

+--------+-----------+
| SizeID | SizeValue |
+--------+-----------+
| s15    |        15 |
| s16    |        16 |
| s17    |        17 |
| s18    |        18 |
| s19    |        19 |
| s20    |        20 |
| s21    |        21 |
| s22    |        22 |
...

а таблица Orders так:

CREATE TABLE `Orders` (
  `OrderID` varchar(10) NOT NULL,
  `ModelID` varchar(6) NOT NULL,
  `SizeLEFT` char(3) NOT NULL,
  `SizeRIGHT` char(3) NOT NULL,
   ...
   ...
PRIMARY KEY (`OrderID`),
  KEY `ModelID` (`ModelID`),
  KEY `SizeLEFT` (`SizeLEFT`),
  KEY `SizeRIGHT` (`SizeRIGHT`),
  KEY `UrkLEFT` (`UrkLEFT`),
  ...
 

Отредактированно Dmitriy88 (22.03.2013 14:18:59)

Неактивен

 

#4 22.03.2013 15:35:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите с соединением множества таблиц в операторе select

select s.SizeValue as SizeLEFT from Orders AS o JOIN Sizes AS s ON o.SizeLEFT=s.SizeID AND o.SizeRIGHT=s.SizeID;

Неактивен

 

#5 22.03.2013 16:39:45

Dmitriy88
Участник
Зарегистрирован: 21.03.2013
Сообщений: 9

Re: помогите с соединением множества таблиц в операторе select

Спасибо огромное, это помогло!)) Но теперь новая неувязка, если например SizeLEFT SizeRIGHT равны, содержат одно и тоже число (точнее один и тот же внешний ключ) то результат выводится, но если они не равны и в каждой разный ключ, то никакого результата не будет (Empty set), хотя в таблице Orders запись есть, к примеру такая:

mysql> select * from Orders\G;
*************************** 1. row ***************************
         OrderID: 1
         ModelID: 1
        SizeLEFT: s22
       SizeRIGHT: s23
         UrkLEFT: u200
        UrkRIGHT: u200
      MaterialID: mk
      HeightLEFT: h32
     HeightRIGHT: h32
   TopVolumeLEFT: t32
  TopVolumeRIGHT: t32
 AnkleVolumeLEFT: a32
AnkleVolumeRIGHT: a32
    KvVolumeLEFT: k32
   KvVolumeRIGHT: k32
      CustomerID: 1
      EmployeeID: 1
            Date: 2013-03-22 16:06:58
         Comment: нет
1 row in set (0.00 sec)

А запрос на вывод информации такой:
SELECT SQL_BIG_RESULT
           OrderID,
           ModelID,
           s.SizeValue as SizeLEFT,
           s.SizeValue as SizeRIGHT,
           u.UrkValue as UrkLEFT,
           u.UrkValue as UrkRIGHT,
           MaterialValue,
           h.HeightValue as HeightLEFT,
           h.HeightValue as HeightRIGHT,
           t.TopVolumeValue as TopVolumeLEFT,
           t.TopVolumeValue as TopVolumeRIGHT,
           a.AnkleVolumeValue as AnkleVolumeLEFT,
           a.AnkleVolumeValue as AnkleVolumeRIGHT,
           k.KvVolumeValue as KvVolumeLEFT,
           k.KvVolumeValue as KvVolumeRIGHT,
           CONCAT(CustomerSN, ' ', LEFT(CustomerFN, 1), '.', LEFT(CustomerP, 1), '.') AS Customer,
           CONCAT(EmployeeSN, ' ', LEFT(EmployeeFN, 1), '.', LEFT(EmployeeP, 1), '.') AS Employee,
           Date,
           Comment
        FROM Orders AS o INNER JOIN Sizes AS s ON o.SizeLEFT=s.SizeID AND o.SizeRIGHT=s.SizeID
                 INNER JOIN Model USING (ModelID)
                 INNER JOIN Urk AS u ON o.UrkLEFT=u.UrkID AND o.UrkRIGHT=u.UrkID
                 INNER JOIN Materials USING (MaterialID)
                 INNER JOIN Height AS h ON o.HeightLEFT=h.HeightID AND o.HeightRIGHT=h.HeightID
                 INNER JOIN TopVolume AS t ON o.TopVolumeLEFT=t.TopVolumeID AND o.TopVolumeRIGHT=t.TopVolumeID
                 INNER JOIN AnkleVolume AS a ON o.AnkleVolumeLEFT=a.AnkleVolumeID AND o.AnkleVolumeRIGHT=a.AnkleVolumeID
                 INNER JOIN KvVolume AS k ON o.KvVolumeLEFT=k.KvVolumeID AND o.KvVolumeRIGHT=k.KvVolumeID
                 INNER JOIN Customers USING (CustomerID)
                 INNER JOIN Employees USING (EmployeeID)
        ORDER BY Date DESC
 

Отредактированно Dmitriy88 (22.03.2013 17:27:54)

Неактивен

 

#6 23.03.2013 00:05:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите с соединением множества таблиц в операторе select

Вместо
         FROM Orders AS o INNER JOIN Sizes AS s ON o.SizeLEFT=s.SizeID AND o.SizeRIGHT=s.SizeID
нужно
        ... FROM Orders AS o INNER JOIN Sizes AS s ON o.SizeLEFT=s.SizeID JOIN Size s1 ON o.SizeRIGHT=s1.SizeID ...

Посмотрите  http://sqlinfo.ru/forum/viewtopic.php?id=3210

Неактивен

 

#7 23.03.2013 10:19:11

Dmitriy88
Участник
Зарегистрирован: 21.03.2013
Сообщений: 9

Re: помогите с соединением множества таблиц в операторе select

Премного благодарен!)) Спасибо, vasya

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson