Wielokrotny select - rekurencja ?...

0

Witam
Temat wiem że "nie brzmi" - niestety nie wiem jak sprecyzować to co chce uzyskać.

Jest sobie tabela "material":

| idM | idNM |

| 1 | 0 |
| 3 | 0 |
| 4 | 3 |
| 5 | 4 |
| 6 | 1 |

idM - indeks materiału/kategorii
idNM - indeks kategorii

Chciał bym jednym wywołaniem zapytania uzyskać wszystkie "wyższe" kategorie podając id materiału/kategorii

Na tą chwile rozwiązałem to tak :

select m.idNM,
(select m2.idNM from material m2 where m2.idM=m.idNM) as idnm2,
(select m3.idNM from material m3 where m3.idM=idnm2) as idnm3,
(select m4.idNM from material m4 where m4.idM=idnm3) as idnm4
from material m where idM=5


oddaje to z przykładu : 4,3,0,null

Efekt jest prawie zadowalający.

  1. jeśli idM było dość "płytko" w kategoriach to zapytanie oddaje mi niepotrzebne null'e
  2. mam wrażenie że można to zrobić ładniej, tylko nie wiem jak :/
    Potrzebuje by zapytanie oddało mi id-ki kategorii od tyłu do 0 w jednym wierszu
0

?

SELECT DISTINCT m.idNM
FROM material m
WHERE m.idM <= 5
ORDER BY m.idM DESC
0

Hmmm, to nie działa. W ten sposób dostaje wszystkie "niższe" cyfrowo kategorie bez brania pod uwagę ich powiązań. może bardziej bogaty przykład podam :
idM idNM
21 0
22 0
23 0
24 0
25 0
26 22
27 26
28 22
29 0
30 0
31 29
32 29
33 29
34 0
35 34
36 34
37 36
38 25

dla idM =37 moje zapytanie odda : 36,34,0,null
a twoje :36,34,29,26,22,0 i ten wynik jest nieprawidłowy - 29,26,22 nie są związane z idM=37

0
SELECT IdM, @p:=idNM 
FROM (SELECT * FROM material ORDER BY idM DESC) t
INNER JOIN (SELECT @p:=5) tmp
WHERE idM=@p
0

No to już jest zadowalające :) - choć przydała by się krótka lekcja jak to działa :)

2

Ten @p to tzw. User Defined Variable czyli zmienna. Ustawiamy ją na @p:=5 i do niej joinujemy naszą tabelę. Nasz select najpierw znajdzie nasze najmłodsze dziecko idM=@p czyli 5. Przy każdym znalezionym rekordzie nasza zmienna @p przyjmuje nową wartość czyli wartość dziecka @p:=idNM czyli przy pierwszym rekordzie wyświetli 5 (najmłodsze dziecko) i 4 (dziecko piątki), a następnie do tej wartości poszukuje rodzica idM=@p, potem wyświetla tego rodzica 4 i znów ustawia na zmiennej @p dziecko czyli @p:=idNM w tym przypadku 3. Będzie tak robić dopóki znajdzie ostatnie dziecko.

0

Dzięki ;)

0

W nawiązaniu do tego postu przedstawiam problem z kompatybilnością MySQL a MariaDB.
MySQL a MariaDB - Różne działanie tego samego zapytania
Jeśli ktoś coś może pomóc to zapraszam na nowy wątek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1