Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Proste zapytanie mysql, wyciąganie nazw tagów
Forum PHP.pl > Forum > Przedszkole
riczlogan
Mam tabele

News
id nazwa tagi
1 Programowanie 1,3
oraz

Tagi
id nazwa
1 PHP
2 C
3 Java

W jaki sposób wyciągnąć jakie tagi ma News (nazwy tagów)?
miniol
Tagi najpierw dzielisz w PHP za pomocą funkcji explode, a następnie w zapytaniu mysql używasz polecenia JOIN.
skowron-line
Cytat(miniol @ 16.05.2012, 12:29:53 ) *
Tagi najpierw dzielisz w PHP za pomocą funkcji explode, a następnie w zapytaniu mysql używasz polecenia JOIN.

Chyba chodziło Ci o IN

Edit:
@riczlogan taki sposób przechowywania danych jest dość kiepski.
riczlogan
Czyli coś takiego?
  1. $query = mysql_query("SELECT tagi FROM News WHERE id=1");
  2. $row = mysql_fetch_assoc($query);
  3.  
  4.  
  5. foreach ($row as $r){
  6.  
  7. $tagi = explode(",", $r);
  8.  
  9. echo $tagi[0];
  10. echo '<br/>';
  11. echo $tagi[1];
  12. }


SELECT Tagi.nazwa FROM Tagi, News WHERE News.tagi IN ( $tagi[0], $tagi[1] );

skowron-line
  1. $query = mysql_query("SELECT tagi FROM News WHERE id=1");
  2. $row = mysql_fetch_assoc($query);
  3.  
  4.  
  5. foreach ($row as $r){
  6.  
  7. $query2 = mysql_query('SELECT Tagi.nazwa FROM Tagi, News WHERE News.tagi IN ('. $r['tagi'] .')');
  8.  
  9. }
  10.  

*pisane z palca.
riczlogan
Chyba to zapytanie jest złe. Wyświetla mi nazwy WSZYSTKICH tagów a nie tagów konkretnego newsa (nawet jak w phpmyadmin dam

SELECT Tagi.nazwa
FROM Tagi, News
WHERE News.tagi IN (1, 3)

)
miniol
Cytat(skowron-line @ 16.05.2012, 15:15:11 ) *
Chyba chodziło Ci o IN

Wydaje mi się, że JOIN jest odpowiedni dla jego przykładu. I właśnie z niego bym radził skorzystać.
riczlogan
A w jaki sposób mogę kolumnę tagi z News przenieść do nowej tabeli tagi_news tak żeby mieć tam id_newsa id_tagu. Można to jakoś zautomatyzować? Mógłbym prosić o jakieś ogólne "kroki" ?
bostaf
Cytat(riczlogan @ 17.05.2012, 08:49:09 ) *
A w jaki sposób mogę kolumnę tagi z News przenieść do nowej tabeli tagi_news tak żeby mieć tam id_newsa id_tagu. Można to jakoś zautomatyzować? Mógłbym prosić o jakieś ogólne "kroki" ?


  1. CREATE TABLE tagi_news SELECT id AS id_newsa, tagi AS id_tagu FROM News

Z tym, że w Twojej tabeli "News" kolumna "tagi" przechowuje kilka tagów a najlepiej by było gdyby nowa tabela "tagi_news" przechowywała tylko jeden identyfikator tagu. Czyli, że trzeba by było zastosować regex na kolumnie "tagi", czego samym SQLem nie zrobisz. Piszę "samym" bo można zastosować jakąś bibliotekę do obsługi wyrażeń regularnych w MySQLu, np. LIB_MYSQLUDF_PREG. To jednak wymaga nieco większej niż podstawowa znajomości SQLa.

Żeby osiągnąć zamierzony efekt (czyli jeden id newsa - jeden id tagu) bez zaawansowanej wiedzy, musiałbyś wykorzystać PHP.
  1. $result = mysql_query("SELECT id, tagi FROM news");
  2. while($row = mysql_fetch_assoc($result)) {
  3. $newsy_tagi[$row['id']] = explode(',', $row['tagi']);
  4. }
  5.  
  6. mysql_query("CREATE TABLE tagi_news (id_newsa int(11) NULL, id_tagu int(11) NULL)");
  7.  
  8. foreach($newsy_tagi as $id_newsa => $tagi)
  9. foreach($tagi as $id_tagu)
  10. mysql_query("INSERT INTO tagi_news (id_newsa, id_tagu) VALUES ('$id_newsa', '$id_tagu')");
  11.  
  12. echo 'Zrobione.';
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.