Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Przypisanie/skojarzenie rekordu do innego rekordu tej samej tabeli... jak?
bubek3
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.04.2012

Ostrzeżenie: (0%)
-----


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?

Ten post edytował bubek3 24.04.2012, 16:09:46
Go to the top of the page
+Quote Post
alegorn
post
Post #2





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
bubek3
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.04.2012

Ostrzeżenie: (0%)
-----


alegorn, nie wiem czy ja źle zrozumiałem czy Ty mnie źle zrozumiałeś, ale dziękuję za chęć pomocy (IMG:style_emoticons/default/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... :/
Go to the top of the page
+Quote Post
alegorn
post
Post #4





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


zrozumialem, ale ty nie zrozumiales ze zrozumialem (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
bubek3
post
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.04.2012

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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. }
Go to the top of the page
+Quote Post
Pilsener
post
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
bubek3
post
Post #7





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.04.2012

Ostrzeżenie: (0%)
-----


Pilsener, dokładnie, dobrze zrozumiałeś (IMG:style_emoticons/default/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ę (IMG:style_emoticons/default/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.

Ten post edytował bubek3 25.04.2012, 15:07:23
Go to the top of the page
+Quote Post
alegorn
post
Post #8





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
bubek3
post
Post #9





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.04.2012

Ostrzeżenie: (0%)
-----


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ł" (IMG:style_emoticons/default/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ę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 10:22