Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pomoc w tworzeniu zaawansowanego zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
nixau
Witam. Może ktoś z Państwa pomoże mi rozwiązać następujący problem.

Mamy 2 tabele

tabela "test" ma następujące komórki
id | nazwa | opis
1 | test | to jest test
2 | test 2 | to jest test 2
3 | ... | ...
4 | ... | ...

tabela "nazwa"

id | nazwa | wartości
1 | nazwa 1 | 1,2
2 | nazwa 2 | 1,4
3 | nazwa 3 | 1,4,2,3

jak zrobić zapytanie takie, że wybieram konkretny id z tabeli "nazwa" oraz wszystkie komórki z tabeli "test" które odpowiadają numeracji z tabeli "nazwa".wartości

Ja poradziłęm sobie tak (w skrócie):

select * from test;
...
$t[ id ] = nazwa;

select * from nazwa where id=5;
...
$w = explode(',', $wartosc)

for (...) echo $t[ ($w[$i]) ];

ale interesuje mnie bardziej profesjonalne podejście do tego problemu (może jest to możliwe zrobienie w jednym zapytaniu)


Przy okazji ma ktoś jakieś ciekawe tutoriale to opisu zaawansowanych zapytań w mysql? Tak żeby były jeszcze opisane przykłady z użyciem IF, oraz @ (np. @val := if (...)).
wipo
Jak piszesz o profesionalizmie to może zastosuj inna konstrukcję:
rabela test

id | nazwa | opis
1 | test | to jest test
2 | test 2 | to jest test 2
3 | ... | ...
4 | ... | ...

tabela "nazwa"

id | nazwa | wartości
1 | nazwa 1 | 1
1 | nazwa 1 | 2
2 | nazwa 2 | 4
2 | nazwa 2 | 1
3 | nazwa 3 | 1
3 | nazwa 3 | 4
3 | nazwa 3 | 2
3 | nazwa 3 | 3

a zapytanie
  1. SELECT * FROM nazwa n JOIN test t ON t.id=n.wartosc WHERE t.nazwa='jakaś nazwa'
nixau
Niestety nie mogę stworzyć takiej konstrukcji jak Pan proponuje, ponieważ, w tabeli "nazwa", komórka "wartość" może przyjać nawet do 100 wpisów i więcej. Sama komórka "wartość" przetrzymuje identyfikatory tabeli "test", gdzie po wybraniu danego zapytania będą wyświetlone opisy (mogą to być np. nazwy części samochodowych, składniki lub inne podobne rzeczy). A zatem bardziej racjonalne podejście (tak mi się wydaje) jest te które zaproponowałem.
Norbas
Powinieneś zastosować jeszcze jedną tabelę np. 'nazwa_wartosci', która będzie przechowywać identyfikator z tabeli nazwa i wartości jako pojedyncze rekordy.
id_nazwa, id_test
1,1
1,2
2,1
2,4
3,1
3,4
3,2
3,3
Cytat
jak zrobić zapytanie takie, że wybieram konkretny id z tabeli "nazwa" oraz wszystkie komórki z tabeli "test" które odpowiadają numeracji z tabeli "nazwa".wartości

  1. SELECT n.id, t.*
  2. FROM nazwa AS n, test AS t, nazwa_wartosci AS nw
  3. WHERE n.id=... AND n.id=nw.id_nazwa AND nw.id_test=t.id
nixau
Wydaje się mi, że nie ma potrzeby tworzenia dodatkowej (trzeciej) tabeli. Dodam, że w tabeli "nazwa" komórki "wartość" mogą przyjmować różne i losowe wartości. To tak jakbyśmy mieli tabelę "samochody", a druga tabela to "części" i w tabeli "samochody" dodając nowy samochód, dodalibyśmy (w jednej komórce) numery identyfikacyjne wszystkich użytych części (a to wszystko w jednym rekordzie).

Sądzę, że można to uczynić na jednym zapytaniu - zapewne trzeba użyć "magicznych" sztuczek i pewnie jeszcze pętli w zapytaniu smile.gif Może któryś ze spacjalistów ma jakiś pomysł.

ps. ja ciągle się uczę mysql tak więc będe wdzięczny jak ktoś podzieli się ciekawymi opisami bardzo zaawansowanych zapytań i "sztuczek" w mysql (może być np. w języku angielskim).
wipo
No to norbas i ja daliśmy Ci gotowe rozwiązanie, którego Ty nie chcesz wykorzystać tylko tworzyć własne cyrki, które tylko bardziej obciążą bazę i zwiększą czas oczekiwania a wynik i tak dosteniesz ten sam.

Takie są moje przemyślenia po tym co napisałeś. Sądzę że albo źle opisałeś problem albo nie rozumiesz odpowiedzi
nixau
To może jeszcze inaczej.

Tabela 1 (T1)
Kod
id | nazwa
1 | Mleko
2 | Jajko
3 | Cukier
... (tutaj więcej rzeczy)


Tabela 2 (T2)
Kod
id | nazwa | skladniki
1 | Przepis 1 | 1=1 szklanka;2=3 sztuki;3=2 łyżeczki


i teraz chodzi o utworzenie odpowiedniego zapytania sql na tych dwóch tabelach, które będzie posiadać takie elementy aby przedstawi efekt w następującej formie:

Kod
Nazwa przepisu: Przepis 1
Składniki:
Mleko: 1 szklanka
Jajko: 3 sztuki
Cukier: 2 łyżeczki
Norbas
Ale jesteś uparty winksmiley.jpg Nie powinno się robić takiej struktury bazy danych jaką podałeś - błąd już w fazie projektowania.
Jeśli chcesz tak zrobić, to musisz wyraźnie oddzielić od siebie składniki, aby wiedzieć gdzie zaczyna się kolejny identyfikator tabeli t1 (chyba, że będzie ich mniej niż 10).
W przykładzie, który podałeś pole 'skladniki' może mieć postać: ';1=1 szklanka;2=3 sztuki;3=2 łyżeczki' (średnik na początku).
Wtedy zapytanie można zbudować następująco:
  1. SELECT t2.nazwa, t1.id, t1.nazwa, skladniki
  2. FROM t1, t2
  3. WHERE t2.id = 1 AND INSTR(skladniki, CONCAT(';', t1.id, '=')) > 0

Po wykonaniu zapytania otrzymasz 3 wiersze:
  1. Przepis 1 | 1 | Mleko | ;1=1 szklanka;2=3 sztuki;3=2 łyżeczki
  2. Przepis 1 | 2 | Jajko | ;1=1 szklanka;2=3 sztuki;3=2 łyżeczki
  3. Przepis 1 | 3 | Cukier | ;1=1 szklanka;2=3 sztuki;3=2 łyżeczki

i musisz kolejno zamieniać w pętli ';identyfikator=' na t1.nazwa
IMO to zupełnie nie ma sensu. Wyobraź sobie, że otrzymasz 100 wierszy smile.gif
dr_bonzo
Cytat
Niestety nie mogę stworzyć takiej konstrukcji jak Pan proponuje,[...]

Ale generalnie to strukture bazy mozesz zmienic?

Cytat
To tak jakbyśmy mieli tabelę "samochody", a druga tabela to "części" i w tabeli "samochody" dodając nowy samochód, dodalibyśmy (w jednej komórce) numery identyfikacyjne wszystkich użytych części (a to wszystko w jednym rekordzie).


Mozesz podac konkretne nazwy tabel i opisac co chcesz zrobic, bo nazwy takie jak 'nazwa', 'test' nie ulatwiaja rozwiazania problemu.

Przyklad z samochodami jest zrozumialy (ale nie wiem czy akurat tym sie zajmujesz).
Jesli samochod sklada sie z wielu czesci, i kazda czesc moze byc uzywa w wielu roznych samochodach (np. te same kola; i nie mowie tu o tej samej instancji czesci, bo przeciez nie zbudujesz dwoch samochodow z czterech kol smile.gif)

Jak to ma w bazie wygladac (juz ci o tym pisali)
* Standardowa relacja wiele do wielu (+ agregacja (nie kompozycja)):

* Tabele:
Samochody ( id, nazwa , ...)
Czesci ( id, nazwa, ...)
Czesci_Samochody ( czesc_id, samochod_id ) -- umozliwi ci przypisanie wielu czesci do samochodow i umozliwi samochodowi skladanie sie z wielu czesci

Cytat
ps. ja ciągle się uczę mysql tak więc będe wdzięczny jak ktoś podzieli się ciekawymi opisami bardzo zaawansowanych zapytań i "sztuczek" w mysql (może być np. w języku angielskim).

Zalecam poznanie najpierw podstaw projektowania baz danych.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.