Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobranie danych z dwóch tabel i pogrupowanie według pierwszej tabeli
Forum PHP.pl > Forum > Bazy danych
pgrzelka
Witam

posiadam dwie tabelę

pages_cats
-cat_id
-cat_title

pages
-p_id
-p_title
-p_catid

potrzebuję pobrać dane w mniej więcej taki sposób
  1. "SELECT pages_cats.cat_title,
  2. (SELECT pages.p_title FROM pages WHERE (pages.p_catid=pages_cats.cat_id)) as dane
  3. FROM pages_cats"

czyli do każdego rekordu z 'pages_cats' dodajemy wszystkie rekordy z 'pages' gdzie pages.p_catid = pages_cats.cat_id

dostaje taki komunikat:
Cytat
SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row


pierwszy raz stworzyłem takie zapytanie i mam z nim spory problem,
po błędzie widzę że chodzi o to że wewnętrzne zapytanie zwróciło więcej niż jeden rekord, ale mi właśnie o to chodzi
gdzie tu jest błąd ?
kefirek
Powinno dzialac
  1. SELECT c.*, p.* FROM pages p LEFT JOIN pages_cats c ON (p.p_catid=c.cat_id)
pgrzelka
@Kefirek, trochę o coś innego mi chodzi

po dodaniu LIMIT 1 do wewnętrznego zapytania uzyskałem coś takiego
  1. "SELECT pages_cats.*,
  2. (SELECT pages.p_title FROM pages WHERE (pages.p_catid=pages_cats.cat_id) LIMIT 1 ) as dane
  3. FROM pages_cats"

Kod
     Array
      (
          [0] => Array
              (
                  [cat_id] => 1
                  [cat_siteid] => 1
                  [cat_title] => testowa2sa
                  [dane] => druga strona
              )
      
          [1] => Array
              (
                  [cat_id] => 3
                  [cat_siteid] => 1
                  [cat_title] => Test
                  [dane] =>
              )
      
      )


a chciałbym dostać coś takiego:

Kod
Array
      (
          [0] => Array
              (
                  [cat_id] => 1
                  [cat_siteid] => 1
                  [cat_title] => testowa2sa
                  [dane] => array('druga strona', 'trzecia strona', 'i nastepna z tabeli pages')
              )
      
          [1] => Array
              (
                  [cat_id] => 3
                  [cat_siteid] => 1
                  [cat_title] => Test
                  [dane] => array('rekordy z pages', '', '')
              )
      
      )

czyli chciałbym pobrać wszystkie rekordy z 'pages' przypisane do danej kategorii a nie tylko jeden
kefirek
Zobacz tak
  1. SELECT c.cat_id, c.cat_title, GROUP_CONCAT(p_title) AS kat FROM pages_cats c
  2. LEFT JOIN pages p ON (c.cat_id=p.p_catid)
  3. GROUP BY cat_id


ALbo tak

  1. <?php
  2. $wynik = mysql_query("SELECT * FROM pages_cats");
  3. if(mysql_num_rows($wynik) > 0) {
  4. while($r = mysql_fetch_assoc($wynik)) {
  5. echo $r['cat_title'].'<br>';
  6. $wynik1 = mysql_query("SELECT p_title FROM pages WHERE p_catid=".$r['cat_id']."");
  7. while($r1 = mysql_fetch_assoc($wynik1)) {
  8. echo $r1['p_title'].'<br>';
  9. }  
  10. }
  11. }
  12. ?>


Innego pomysłu nie mam
pgrzelka
dzięki kefirek za pomoc, zrobiłem trochę inaczej
wykorzystałem zapytanie z Twojego pierwszego posta i potem przetworzyłem dane
Kod
        $rows = $db->fetchAll("
        SELECT c.cat_title, p.p_linktitle, p.p_id
        FROM pages p
        LEFT JOIN pages_cats c ON (p.p_catid=c.cat_id)
        WHERE c.cat_siteid='$site_id'
        ");

        $rows2 = array();
        foreach ($rows as $v) {
            $rows2[$v['cat_title']][] = array($v['p_linktitle'], $v['p_id']);
        }
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.