Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przypisanie/skojarzenie rekordu do innego rekordu tej samej tabeli... jak?
Forum PHP.pl > Forum > Bazy danych > MySQL
bubek3
Witam,

Niby banalna rzecz ale jednak mam z nią ogromny problem.

Załóżmy że mam tabele:
Kod
|------------------|
| id | model | typ |
|------------------|
| 1  | kart  | bk  |
| 2  | szal  | kb  |
| 3  | link  | bk  |
|------------------|


Wykonałem już połączenie z bazą danych w AJAX - po wyborze modelu bez przeładowania strony wyświetla mi odpowiedni wiersz (wybierając z listy wyboru select model 'kart', wyświetla mi pełne informacje o tym modelu - wraz z rekordem typ). Chciałbym jednak by prócz wyświetlenia tego jednego rekordu, zostały wyświetlane również inne modele z takim samym typem. Innmi słowy - chcę by po wybraniu modelu 'kart', wyświetliło również model 'link', ponieważ oba mają takie same rekordy typ.
Jak takie coś wykonać? jakaś zmienna?
alegorn
  1. SELECT t2.* FROM TABLE t JOIN TABLE t2 ON t1.typ = t2.typ WHERE t1.model = 'kart'

powinno banglac.

jesli przewidujesz wiele rekordow w tabeli - zastosuj index na typ.


poza tym masz nie znormalizowana baze danych

j.
bubek3
alegorn, nie wiem czy ja źle zrozumiałem czy Ty mnie źle zrozumiałeś, ale dziękuję za chęć pomocy wink.gif

Wszystkie dane są w jednej tabeli - Twoja komenda odnosi się chyba do dwóch tabel w tej samej bazie. Chodzi o to by z tej jednej tabeli w wyniku zapytania wyrzuciło mi wszystkie rekordy które mają ten sam typ.
Po odpaleniu strony wyświetla mi liste rozwijalną typu select. Po wyborze jakiegoś modelu następuje łączenie z bazą (w ajax) i od razu po wyborze modelu, niżej wyświetla mi wynik. Niestety wyświetla tylko jeden rekord z tabeli (model i typ) modelu który wcześniej kliknąłem/wybrałem.
Zależy mi na tym by prócz tego jednego rekordu - z tej samej tabeli - pobierało inne rekordy, które mają ten sam typ co model przeze mnie wybrany.

Cytat("alegorn")
poza tym masz nie znormalizowana baze danych

Niestety tego nie zrozumiałem...

Zaznaczę, że nie jestem w tej dziedznie ekspertem... ucze sę na własnych błedach, ale ten problem mnie przeasta... :/
alegorn
zrozumialem, ale ty nie zrozumiales ze zrozumialem wink.gif

sprawdzales to zapytanie?
wstaw zamiast slowo table (to sie sformatowalo niepotrzebnie) swoja nazwe tabeli

  1. SELECT t2.* FROM twoja_tabelat JOIN twoja_tabela t2 ON t1.typ = t2.typ WHERE t1.model = 'kart'



j.
bubek3
alegorn, niestety zapytanie nie działa :/
Dla lepszego zobrazowania daję pliki które odpowiadają za wszystko (niestety nie widzę możliwości dodania jako załączników).

Z góry dziękję za wskazanie błędów jakie popełniłem smile.gif

index.php
  1. <?php
  2.  
  3. $host = "localhost";
  4. $username = "db600070";
  5. $password = "pass";
  6. $database = "db600070";
  7.  
  8. mysql_connect($host,$username,$password);
  9. mysql_select_db($database);
  10.  
  11. echo '<head>';
  12. echo '<script type="text/javascript" src="wybor.js"></script>';
  13. echo '</head>';
  14.  
  15. $query = "SELECT * FROM tabela";
  16. $result2 = mysql_query($query);
  17. $lista = '' ;
  18.  
  19. echo '<select name="part" onchange="showPart(this.value)">';
  20. while($row = mysql_Fetch_array($result2)){
  21. echo '<option value="'.$row['id'].'">'.$row['model'].'</option>';
  22. }
  23. echo '</select>';
  24. echo '<div id="informacja">Infomacje:</div>';
  25. ?>


baza.php
  1. <?php
  2. $part=$_GET["part"];
  3.  
  4. $host = "localhost";
  5. $username = "db600070";
  6. $password = "pass";
  7. $database = "db600070";
  8.  
  9. mysql_connect($host,$username,$password);
  10. mysql_select_db($database);
  11.  
  12. $sql="SELECT * FROM tabela WHERE id = '".$part."'";
  13. $result = mysql_query($sql);
  14.  
  15. echo "<table>
  16. <tr>
  17. <td>Model</td>
  18. <td>Typ</td>
  19. </tr>";
  20.  
  21. while($row = mysql_fetch_array($result))
  22. {
  23. echo "<tr>";
  24. echo "<td>" . $row['model'] . "</td>";
  25. echo "<td>" . $row['typ'] . "</td>";
  26. echo "</tr>";
  27. }
  28. echo "</table>";
  29. ?>


wybor.js
  1. var xmlhttp;
  2.  
  3. function showPart(str)
  4. {
  5. xmlhttp=GetXmlHttpObject();
  6. var url="baza.php";
  7. url=url+"?part="+str;
  8. url=url+"&sid="+Math.random();
  9. xmlhttp.onreadystatechange=stateChanged;
  10. xmlhttp.open("GET",url,true);
  11. xmlhttp.send(null);
  12. }
  13.  
  14. function stateChanged()
  15. {
  16. if (xmlhttp.readyState==4)
  17. {
  18. document.getElementById("informacja").innerHTML=xmlhttp.responseText;
  19. }
  20. }
  21.  
  22. function GetXmlHttpObject()
  23. {
  24. if (window.XMLHttpRequest)
  25. {
  26. return new XMLHttpRequest();
  27. }
  28. return null;
  29. }
Pilsener
Nie wiem czy dobrze zrozumiałem:

Szukasz np. w tabeli "dziwni ludzie" gościa o name = "Jaś" (np. where name="Jaś")
W polu "obuwie" "Jaś" ma wpisane "gumofilce", chcesz jeszcze więc pobrać innych dziwnych ludzi z tej tabeli, którzy mają takie gumiaki?

Proponuję coś takiego:
  1. SELECT * FROM dziwni_ludzie AS dl1
  2. LEFT JOIN dziwni_ludzie AS dl2 ON dl1.obuwie=dl2.obuwie
  3. WHERE dl1.name="Jaś"


Jeśli ma być zachowana struktura tabeli to pewnie trzeba użyć UNION zamiast JOIN.
bubek3
Pilsener, dokładnie, dobrze zrozumiałeś smile.gif dziękuję, teraz wszystko działa tak jak zaplanowałem.
alegorn, chyba podobnie chciałeś zrobić ale nie potrafiłem sobie poradzić z Twoim zapytaniem :/ mimo wszystko - Tobie również dziękuję smile.gif

Dla ludzi którzy będą mieli podobny problem - rozwiązanie mojego zamieszczam niżej.
Przeszukując fora zauważyłem, że ludzie nie chcą się dzielić kiedy rozwiążą swój problem - szkoda bo pewnie szybciej znalazłbym rozwiązanie i przede wszystkim nikt przeze mnie nie marnowałby swojego czasu.
Dzięki temu nauczyłem się jednak sporo przez czytanie i samo kombinowanie w kodzie.

W pliku baza.php, wystarczy podmienić linię 12:
  1. $sql="SELECT * FROM tabela WHERE id = '".$part."'";
na
  1. $sql="SELECT * FROM tabela AS dl1 LEFT JOIN tabela AS dl2 ON dl1.typ=dl2.typ WHERE dl1.id='".$part."'";


Dziękuję wszystkim zainteresowanym.
alegorn
huh?
toż to jeden c**j...

left join i join w tym wypadku nie robi roznicy.

podajac zas

select *

zamiast mojego

select t2.*

powodujesz ze masz smieci w zwrocie., w pierwszej czesci masz zduplikowane rekordy o tabele t1 - i dopiero w czesci t2 jest rozne co do szczegolow.

no, ale co tam, jesli jestes zadowolony z tego jak ci to dziala - no to najwazniejsze.


Pilsener@:: union nie zadziala.

pozdrawiam,
J.
bubek3
Przepraszam... faktycznie zapytanie alegorn działa. Sprawdziłem drugi raz na spokojnie. Szkoda, że wcześniej zrezygnowałem po pierwszym. Jednak mała literówka wdarła się do Twojego zapytania, a ja głupi nie zauważyłem tak istotnej rzeczy.
Mianowicie:
Cytat("alegorn")
Cytat("alegorn")
SELECT t2.* FROM twoja_tabelat JOIN twoja_tabela t2 ON t1.typ = t2.typ WHERE t1.model = 'kart'

Pełen przypływu radości, że ktoś znalazł dla mnie rozwiązanie wymieniłem twoja_tabelat na swoja nazwę tabeli, nie zwracając uwagi na to że po nazwie powinna znaleźć się nazwa "wirtualnej" tabeli. Zrezygnowałem - jak widać za szybko...
Jak najbardziej śpieszę z "pomógł" smile.gif
I faktycznie... myśląc logicznie, wykorzystując select t2.* nie będzie śmieci w zwrocie.

Cytat("alegorn")
Pilsener@:: union nie zadziala.
Zgadza się smile.gif
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.