Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pobranie danych z dwóch tabel i pogrupowanie według pierwszej tabeli, problem z zapytaniem
pgrzelka
post 23.02.2009, 19:14:01
Post #1





Grupa: Zarejestrowani
Postów: 313
Pomógł: 24
Dołączył: 9.08.2008
Skąd: Kielce

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


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 ?


--------------------
Go to the top of the page
+Quote Post
kefirek
post 23.02.2009, 19:27:01
Post #2





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


Powinno dzialac
  1. SELECT c.*, p.* FROM pages p LEFT JOIN pages_cats c ON (p.p_catid=c.cat_id)
Go to the top of the page
+Quote Post
pgrzelka
post 23.02.2009, 20:03:52
Post #3





Grupa: Zarejestrowani
Postów: 313
Pomógł: 24
Dołączył: 9.08.2008
Skąd: Kielce

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


@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

Ten post edytował pgrzelka 23.02.2009, 20:04:46


--------------------
Go to the top of the page
+Quote Post
kefirek
post 23.02.2009, 20:40:04
Post #4





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


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

Ten post edytował kefirek 23.02.2009, 20:59:46
Go to the top of the page
+Quote Post
pgrzelka
post 23.02.2009, 21:19:29
Post #5





Grupa: Zarejestrowani
Postów: 313
Pomógł: 24
Dołączył: 9.08.2008
Skąd: Kielce

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


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']);
        }


--------------------
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: 14.08.2025 - 14:22