powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / left join
8 сообщений из 8, страница 1 из 1
left join
    #40062012
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE IF NOT EXISTS `dirs` (
`id` smallint(5) unsigned NOT NULL,
  `sid` smallint(5) unsigned NOT NULL DEFAULT '0',
  `ssid` smallint(5) unsigned NOT NULL DEFAULT '0',
  `sssid` smallint(5) unsigned NOT NULL DEFAULT '0',
  `name` char(250) NOT NULL DEFAULT '0',
   ...
);


Так сделаны подкаталоги (топорно, конечно):
sid = id основного каталога
ssid = id подкаталога
sssid = id ПодПодкаталога


Нужно вывести все каталоги и подкаталоги трех уровней (без учета четвертого, sssid)

Код: plsql
1.
2.
3.
4.
5.
6.
SELECT a.name AS n1, b.name AS n2, c.name AS n3
  FROM dirs as a 
  LEFT JOIN dirs as b ON a.id=b.sid and b.ssid=0
  LEFT JOIN dirs as c ON b.id=c.ssid and c.sssid=0
  where a.ssid=0 and a.sssid=0 and b.sssid=0
  ORDER BY a.id, b.name, c.name



Запрос не выводит записи, если в основном каталоге нет подкаталогов, вот для этого:
LEFT JOIN dirs as b ON a.id=b.sid and b.ssid=0

Эта часть работает нормально:
LEFT JOIN dirs as c ON b.id=c.ssid and c.sssid=0
Если есть в подкаталоге - подподкаталоги - работает нормально, выводя Null

Данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
id|name|sid|ssid|sssid
1|Каталог 2|0|0|0
2|Каталог 4|0|0|0
3|ПодКаталог 2-1|1|0|0
4|ПодКаталог 2-2|1|0|0
5|ПодКаталог 2-1-1|1|1|0
6|ПодКаталог 2-1-2|1|1|0

Примерно отдает:
Код: plaintext
1.
2.
3.
Каталог 2|ПодКаталог 2-1|ПодКаталог 2-1-1
Каталог 2|ПодКаталог 2-1|ПодКаталог 2-1-2
Каталог 2|ПодКаталог 2-2|NULL

Вот этих строк мне не хватает:
Код: plaintext
Каталог 4|NULL|NULL

Т.е. мне нужно так:
Код: plaintext
1.
2.
3.
Каталог 2|ПодКаталог 2-1|ПодКаталог 2-1-1
Каталог 2|ПодКаталог 2-1|ПодКаталог 2-1-2
Каталог 2|ПодКаталог 2-2|NULL
Каталог 4|NULL|NULL
...
Рейтинг: 0 / 0
left join
    #40062070
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выложите пример данных (в виде INSERT INTO) и требуемый результат для именно таких данных.

Также укажите точную версию MySQL.
...
Рейтинг: 0 / 0
left join
    #40062086
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
left join
    #40062087
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE IF NOT EXISTS `dirs` (
`id` smallint(5) unsigned NOT NULL,
  `sid` smallint(5) unsigned NOT NULL DEFAULT '0',
  `ssid` smallint(5) unsigned NOT NULL DEFAULT '0',
  `sssid` smallint(5) unsigned NOT NULL DEFAULT '0',
  `name` char(250) NOT NULL DEFAULT '0');
insert into dirs (id,sid,ssid,sssid,name) values (1,0,0,0,"один");
insert into dirs (id,sid,ssid,sssid,name) values (2,0,0,0,"много");
insert into dirs (id,sid,ssid,sssid,name) values (3,2,0,0,"много подкаталог");
insert into dirs (id,sid,ssid,sssid,name) values (4,2,0,0,"много подкаталог 2");
insert into dirs (id,sid,ssid,sssid,name) values (5,2,4,0,"много ПодПодкаталог 22");




Код: plsql
1.
2.
3.
4.
5.
SELECT a.name AS n1, b.name AS n2, a.id AS id1, b.id AS id2, c.name AS n3, c.id AS id3
  FROM dirs as a LEFT JOIN dirs as b ON a.id=b.sid and b.ssid=0
  LEFT JOIN dirs as c ON b.id=c.ssid and c.sssid=0
  where a.ssid=0 and a.sssid=0 and b.sssid=0
  ORDER BY a.id, b.name, c.name




Выводит:
много|много подкаталог|null
много|много подкатало|много ПодПодкаталог 22

Нужно вывести также :
один|null|null

(удалил id из вывода, для удобства)

http://sqlfiddle.com/#!9/862a5a/1/0
...
Рейтинг: 0 / 0
left join
    #40062147
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
укажите точную версию MySQL.
...
Рейтинг: 0 / 0
left join
    #40062158
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
version 5.5.49

Но, на тестовом сервере с 5.60 http://sqlfiddle.com/#!9/862a5a/1/0 тоже не работает, как нужно мне.
...
Рейтинг: 0 / 0
left join
    #40062207
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
SELECT t1.name, t2.name, t3.name
FROM dirs t1
LEFT JOIN dirs t2 ON t2.sid = t1.id AND t2.ssid = 0
LEFT JOIN dirs t3 ON t3.ssid = t2.id AND t3.sid = t1.id AND t3.sssid = 0
WHERE t1.sid = 0


https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=c6c31bf5b54e7f562a28b7b54ed31e6b
...
Рейтинг: 0 / 0
left join
    #40062221
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, волшебник!

Работает. Спасибо!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / left join
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]