Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MYSQL]Błąd w wyświetlaniu - w jednym zapytaniu - dwóch list rekordów powiązanych (while)., Związane z tagami - słowami kluczowymi
krzysieklos
post 10.03.2009, 09:27:59
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 7.12.2008

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


Witam.
Chciałbym, wyświetlając listę tytułów dokumentów, wyświetlić pod każdym tytułem przypisane do niego słowa kluczowe np.:
1. Tytuł 1
tagi: słowo 1, słowo 2, słowo 3
-----------------------------
2. Tytuł 2
tagi: słowo 2, słowo 4, słowo 5

itd.
Wymyśliłem coś takiego, ale niestety słowa kluczowe dublują w przyroście kwadratowym (co jest w sumie naturalne przy zastosowaniu dwóch pętli while). Nie wiem, jakiego rozwiązanie użyć. Liczę bardzo na pomoc. Z góry dziękuję. A oto kod:

CODE
if (mysql_connect($mysql_host, $mysql_login, $mysql_haslo) and mysql_select_db($mysql_baza)) {

$wynikzajawki = mysql_query("SELECT * FROM $mysql_tabela WHERE nr=$dzial");
if (!$wynikzajawki) echo "Błąd w zapytaniu SQL: ".mysql_error();
}

if ($wynikzajawki) {
//LISTA TYTUŁÓW
while($danezajawki = mysql_fetch_assoc($wynikzajawki)) {
$zajdocid=$danezajawki["id"];
$zajdoctytul=$danezajawki["tytul"];

$wynikzajtagi = mysql_query("SELECT t.id, t.tag FROM $mysql_tabelapor AS at JOIN $mysql_tabelatag AS t ON (at.id_tag=t.id) WHERE (at.id_art=$zajdocid )");

//LISTA TAGÓW
while($danezajtagi = mysql_fetch_assoc($wynikzajtagi)) {
$idtagow=$danezajtagi["id"];
$jakietagi=$danezajtagi["tag"];

if (++$i>0) $przecinek=", "; else $przecinek="";
$tagg.=''.$jakietagi.''.$przecinek;
$zajtagi=rtrim($tagg, ', ');
}

echo '
'.$zajdoctytul.''.$zajtagi.'';
}
} mysql_close();


Ten post edytował krzysieklos 10.03.2009, 09:31:25
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
piotrooo89
post 10.03.2009, 11:52:17
Post #2


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




ja bym to tak zrobił:

  1. <?php
  2. $tytuly = SELECT DISTINCT(*) FROM tytuly;
  3.  
  4. while ($row = mysql_fetch_array($tytuly))
  5. {
  6. $tagi = SELECT * FROM tagi WHERE tytul=$row['tytul'];
  7. echo $row['tytul'];
  8. while ($row2 = mysql_fetch_array($tagi))
  9. {
  10. echo $row2['tagi'];
  11. }
  12. }
  13. ?>


to taki pseudo kod przerób sobie, i sprawdź działanie.


--------------------
Go to the top of the page
+Quote Post
krzysieklos
post 10.03.2009, 12:33:46
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 7.12.2008

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


Niestety nic to nie pomogło. Dalej wyświetla mi podwójnie... Dzięki za odzew.
Go to the top of the page
+Quote Post
piotrooo89
post 10.03.2009, 13:14:07
Post #4


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




a pokaż jak to robisz. kod, pokaż kod.


--------------------
Go to the top of the page
+Quote Post
krzysieklos
post 10.03.2009, 13:29:43
Post #5





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 7.12.2008

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


  1. <?php
  2. if (mysql_connect($mysql_host, $mysql_login, $mysql_haslo) and mysql_select_db($mysql_baza)) {
  3.  
  4. $wynikzajawki = mysql_query("SELECT DISTINCT(*) FROM $mysql_tabela WHERE nr=$dzial");
  5.  
  6. //LISTA TYTUŁÓW
  7. while($danezajawki = mysql_fetch_array($wynikzajawki))
  8. {
  9. $zajdocid=$danezajawki["id"];
  10. $zajdoctytul=$danezajawki["tytul"];
  11.  
  12. $wynikzajtagi = mysql_query("SELECT t.id, t.tag FROM $mysql_tabelapor AS at JOIN $mysql_tabelatag AS t ON (at.id_tag=t.id) WHERE (at.id_art=$zajdocid )");
  13.  
  14. echo $danezajawki["tytul"];
  15.  
  16. //LISTA TAGÓW
  17. while($danezajtagi = mysql_fetch_array($wynikzajtagi))
  18. {
  19.  
  20.  
  21. if (++$i>0) $przecinek=", "; else $przecinek="";
  22. $tagg.=''.$danezajtagi["tag"].''.$przecinek;
  23. $zajtagi=rtrim($tagg, ', ');
  24.  
  25.  
  26. echo ''.$zajtagi.'';
  27. }
  28. }
  29. ?>
Go to the top of the page
+Quote Post
piotrooo89
post 10.03.2009, 13:53:49
Post #6


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




  1. <?php
  2. $wynikzajtagi = mysql_query("SELECT * FROM $mysql_tabelapor, $mysql_tabelatag WHERE $mysql_tabelapor.id_tag=$mysql_tabelatag.id AND at.id_art=$zajdocid ");
  3. ?>


po co JOIN?

Ten post edytował piotrooo89 10.03.2009, 13:54:29


--------------------
Go to the top of the page
+Quote Post
krzysieklos
post 10.03.2009, 14:17:22
Post #7





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 7.12.2008

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


JOIN nic nie zmienia. Problem pewnie tkwi w podwójnym 'while'. To chyba sprawia, że słowa kluczowe się dwoją, troją, itd.
Przejrzałem już cały net i dwie książki. Nie wiem jak to rozwiązać.
Go to the top of the page
+Quote Post
piotrooo89
post 10.03.2009, 14:24:09
Post #8


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




  1. <?php
  2. $wynikzajtagi = mysql_query("SELECT t.id, DISTINCT(t.tag) AS tagi FROM $mysql_tabelapor AS at JOIN $mysql_tabelatag AS t ON (at.id_tag=t.id) WHERE (at.id_art=$zajdocid )");
  3. ?>


i tak spróbuj wypisać:

  1. <?php
  2. $tagg.=''.$danezajtagi["tagi"].''.$przecinek;
  3. ?>


Ten post edytował piotrooo89 10.03.2009, 14:24:31


--------------------
Go to the top of the page
+Quote Post
krzysieklos
post 10.03.2009, 14:35:32
Post #9





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 7.12.2008

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


Niestety - teraz pojawił się komunikat błędu:
[b]
  1. <?php
  2. Warning[/b]:  mysql_fetch_array(): supplied argument is not a valid MySQL result resource in while($danezajtagi = mysql_fetch_array($wynikzajtagi))
  3. ?>


Chyba nic z tego...
Go to the top of the page
+Quote Post
piotrooo89
post 10.03.2009, 14:43:35
Post #10


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




DISTINCT(tag) a tak?

i jeszcze dodaj:

  1. <?php
  2. $wynikzajtagi = mysql_query("SELECT t.id, DISTINCT(t.tag) AS tagi FROM $mysql_tabelapor AS at JOIN $mysql_tabelatag AS t ON (at.id_tag=t.id) WHERE (at.id_art=$zajdocid )") or die(mysql_error());
  3. ?>


--------------------
Go to the top of the page
+Quote Post
krzysieklos
post 10.03.2009, 14:56:02
Post #11





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 7.12.2008

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


Something is wrong in your syntax obok 'DISTINCT(tag) AS tagi FROM tabela_tagi_artykuly AS at JOIN tabela_tagi AS t ON (at.id_tag=t.' w linii 1

:-(
Go to the top of the page
+Quote Post
piotrooo89
post 10.03.2009, 14:58:17
Post #12


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




ja naprawde na Twoim miejscu zrezygnowałbym z tego JOIN'a. możesz to ładnie połączyć tytul.id_tag=tag.id stosujac tylko klauzule WHERE. pozniej mozna juz tylko stosowac aliasy. malo moge pomoc nie znajac struktury tabeli.


--------------------
Go to the top of the page
+Quote Post
krzysieklos
post 10.03.2009, 15:06:21
Post #13





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 7.12.2008

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


Tabele są trzy:
tabela_artykuly:
id | tytul | nr <- numer działu, po którym są sortowane listy dokumentów

tabela_tagi:
id | tagi

tabela_tagi_artykuly:
id_tag | id_art

Zapytanie do bazy robiłem na różne sposoby. Wydaje mi się, że nie powinno być dwóch 'while'. Ale jak to ma wyglądać - nie wiem. W każdym razie dzięki za wsparcie.
Go to the top of the page
+Quote Post
piotrooo89
post 10.03.2009, 15:13:38
Post #14


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




wiec tak:

do pobrania tutułów:

  1. <?php
  2. $tyt = SELECT DISTINCT(*) FROM tabela_artykuly
  3. ?>


do poprania tagow:

  1. <?php
  2. $tag = SELECT * FROM tabela_tagi_artykuly, tabela_tagi, tabela_artykuly
  3. WHERE
  4. tabela_tagi_artykuly.id_tag=tabela_tagi.id
  5. AND
  6. tabela_tagi_artykuly.id_art=tabela_artykuly.id
  7. AND
  8. tytul='$zmienna z pierwszej petli tak jak juz Ci pokazalem'
  9. ?>


--------------------
Go to the top of the page
+Quote Post
krzysieklos
post 10.03.2009, 15:41:47
Post #15





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 7.12.2008

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


Nie wiem. Cały czas krzyczy, że mysql_fetch_array niemożliwe dla zapytania... Będę jeszcze główkował. Może ktoś ma jeszcze jakiś pomysł?

Ten post edytował krzysieklos 10.03.2009, 19:08:28
Go to the top of the page
+Quote Post
piotrooo89
post 10.03.2009, 21:02:06
Post #16


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




bardzo Cię przepraszam... mój błąd...

  1. <?php
  2. $tyt = SELECT DISTINCT tytul, id FROM tabela_artykuly
  3. ?>


tak powinno być.


--------------------
Go to the top of the page
+Quote Post
krzysieklos
post 11.03.2009, 08:43:30
Post #17





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 7.12.2008

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


Dzięki, dzięki. Pokazałeś mi dobry kierunek. W dwóch zapytaniach do bazy użyłem DISTINCT wskazując interesujące mnie komórki. Działa. Raz jeszcze dziękuję. Najlepszego!

Ten post edytował krzysieklos 11.03.2009, 08:43:45
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 25.07.2025 - 09:12