Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Bazy danych _ [SQL] Pobieranie id wiersza z kolumny z poprzedniego wiersza

Napisany przez: neo1986kk 25.03.2022, 21:04:36

id | next
1 | 2
3 | 5
2 | 7
7 | 3

Chciałbym uzyskać

id | next
1 | 2
2 | 7
7 | 3
3 | 5

Czyli po kolei każdy next począwszy od id 1.

I dla chętnych począwszy od wybranego id na przykład zaczynając od 7

id|next
7|3
3|5

Wymyśliłem coś takiego

  1. SELECT t.id, t.next AS next FROM (SELECT t1.id, t1.next FROM TABLE t LEFT JOIN TABLE t1 ON t1.id=t.next) AS t


Ale zwraca coś takiego
id|next

3 | 5
2 | 7
7 | 3

Czyli nie po kolei i bez pierwszego wiersza

  1. SELECT t.id, t.next AS next FROM (SELECT t1.id, t1.id FROM TABLE t1 LEFT JOIN TABLE t2 ON t2.id=t1.next) AS t

Ok, mam wszystkie, ale w złej kolejności, no i nie wiem jak zacząć od id przykładowo 7

1 | 2
3 | 5
2 | 7
7 | 3

Strukturalnie to bym to zrobił mniejwięcej tak:




  1. function getNext($id){
  2. sql: Select http://www.php.net/next from t where id=$id;
  3. return $ret[0];
  4. }
  5. if(getNext(3)>0){
  6. getNext(getNext(3))
  7. }


No i wiadomo to w jakąś pętlę, ale pomyślałem, że może dało by się zrobić to jednym zapytaniem SQL

Napisany przez: viking 26.03.2022, 06:14:56

Nie bardzo rozumiem wg jakiej logiki 2 7 3 5 jest po kolei

Napisany przez: trueblue 26.03.2022, 08:12:33

Wartość next wskazuje jakie kolejne id pobrać.

Napisany przez: viking 26.03.2022, 14:16:17

No to najłatwiej

  1. WITH RECURSIVE cte (`id`, `next`) AS
  2. (
  3. SELECT MIN(id) AS id, next FROM test
  4. UNION ALL
  5. SELECT t2.id, t2.`next` FROM test AS t2
  6. INNER JOIN test ON t2.id = test.next
  7. )
  8. SELECT * FROM cte
  9. -- WHERE id > 2;


Aha, staraj się nie używać słów zastrzeżonych jako nazw https://dev.mysql.com/doc/refman/8.0/en/keywords.html#keywords-8-0-detailed-N

Napisany przez: neo1986kk 26.03.2022, 15:32:20

Zagłębiając się w temat, rzeczywiście to najlepsza droga, niestety każdy edytor wywala błąd składni przy WITH

Napisany przez: viking 26.03.2022, 17:10:06

To straszne. Zmień edytor.

Napisany przez: neo1986kk 26.03.2022, 18:21:02

Cytat(viking @ 26.03.2022, 17:10:06 ) *
To straszne. Zmień edytor.


Chodziło mi o phpmyadmin, workbench, dBeaver i DataBase Workbench Lite, a nie o edytor tekstowy facepalmxd.gif

Żaden nie wykonuje tego zapytania.

Moja wersja SQL 10.1.19 - MariaDB

Napisany przez: viking 26.03.2022, 19:22:35

10.2.10-MariaDB
https://www.fotosik.pl/zdjecie/dcf8b52e4843b417

Napisany przez: neo1986kk 26.03.2022, 20:29:57

Doczytałem, że rercursive działa od wersji 10.2.1, dzięki zrobię update i pewnie będzie wszystko śmigać

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)