Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyświetlenie zapytania MySQL wykorzystującego aliasy.
Forum PHP.pl > Forum > PHP
Bosmanircx
Mam problem z wyświetlaniem rezultatu zapytania MySQLowego. Na pierwszy rzut oka sprawa banalna. A jednak.

Mam 2 tabele (Dla ułatwienia tabele razem z danymi):

Tabela A.
  1. CREATE TABLE `tabA` (
  2. `ida` int(5) NOT NULL AUTO_INCREMENT,
  3. `war1` int(5) NOT NULL,
  4. `war2` int(5) NOT NULL,
  5. `war3` int(5) NOT NULL,
  6. PRIMARY KEY (`ida`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
  8.  
  9. INSERT INTO `tabA` (`ida`, `war1`, `war2`, `war3`) VALUES
  10. (1, 1, 2, 3),
  11. (2, 2, 2, 1),
  12. (3, 3, 1, 1),
  13. (4, 3, 2, 3);


Tabela B.
  1. CREATE TABLE `tabB` (
  2. `idb` int(5) NOT NULL AUTO_INCREMENT,
  3. `warx` varchar(2) NOT NULL,
  4. PRIMARY KEY (`idb`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
  6.  
  7. INSERT INTO `tabB` (`idb`, `warx`) VALUES
  8. (1, 'a'),
  9. (2, 'b'),
  10. (3, 'c'),
  11. (4, 'd');


Moje zapytanie.
  1. SELECT `tabA`.`ida` , `tabA`.`war3` , `tabB`.`warx` , `tabA`.`war1` , `tabA`.`war2` , `tabB_1`.`warx` , `tabB_2`.`warx`
  2. FROM `intranet`.`tabB` `tabB_2`
  3. RIGHT OUTER JOIN (`intranet`.`tabB` `tabB_1`
  4. RIGHT OUTER JOIN (`intranet`.`tabB` `tabB`
  5. RIGHT OUTER JOIN `intranet`.`tabA` `tabA` ON `tabB`.`idb` = `tabA`.`war1`
  6. ) ON `tabB_1`.`idb` = `tabA`.`war2`
  7. ) ON `tabB_2`.`idb` = `tabA`.`war3`

Zapytanie jest na 100% dobre ponieważ po wykonaniu go np w phpMyAdmin działa super.


Rezultat, który chce uzyskać.

id 1,00
1,00 a
2,00 b
3,00 c

id 2,00
2,00 b
2,00 b
1,00 a

id 3,00
3,00 c
1,00 a
1,00 a

id 4,00
3,00 c
2,00 b
3,00 c


Strona z zapytaniem.


  1. mysql_select_db($database_intanet, $intanet);
  2. $query_Recordset1 = "SELECT `tabA`.`ida` , `tabA`.`war3` , `tabB`.`warx` , `tabA`.`war1` , `tabA`.`war2` , `tabB_1`.`warx` , `tabB_2`.`warx` FROM `intranet`.`tabB` `tabB_2` RIGHT OUTER JOIN ( `intranet`.`tabB` `tabB_1` RIGHT OUTER JOIN ( `intranet`.`tabB` `tabB` RIGHT OUTER JOIN `intranet`.`tabA` `tabA` ON `tabB`.`idb` = `tabA`.`war1` ) ON `tabB_1`.`idb` = `tabA`.`war2` ) ON `tabB_2`.`idb` = `tabA`.`war3`";
  3. $Recordset1 = mysql_query($query_Recordset1, $intanet) or die(mysql_error());
  4. $row_Recordset1 = mysql_fetch_assoc($Recordset1);
  5. $totalRows_Recordset1 = mysql_num_rows($Recordset1);
  6. ?>
  7.  
  8.  
  9. <table border="0">
  10.  <tr>
  11.    <td>ida</td>
  12.    <td>war3</td>
  13.    <td>warx</td>
  14.    <td>war1</td>
  15.    <td>war2</td>
  16.    <td>warx</td>
  17.    <td>warx</td>
  18.  </tr>
  19.  <?php do { ?>
  20.    <tr>
  21.      <td><?php echo $row_Recordset1['ida']; ?></td>
  22.      <td><?php echo $row_Recordset1['war3']; ?></td>
  23.      <td><?php echo $row_Recordset1['warx']; ?></td>
  24.      <td><?php echo $row_Recordset1['war1']; ?></td>
  25.      <td><?php echo $row_Recordset1['war2']; ?></td>
  26.      <td><?php echo $row_Recordset1['warx']; ?></td>
  27.      <td><?php echo $row_Recordset1['warx']; ?></td>
  28.    </tr>
  29.    <?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>
  30. </table>
  31. <?php
  32. mysql_free_result($Recordset1);
  33. ?>


Problem
  1. <?php echo $row_Recordset1['warx']; ?>
- wyświetla pierwszą dana. Nie wiem jak wyświetlić pozostałe "warx". Przez to że w zapytaniu tworzone były aliasy, mam 3 zmienne o nazwie "warx".
próbowałem wywoływać je podajac dodatkowo alias tabeli czyli:
  1. <?php echo $row_Recordset1['tabB'.'warx']; ?>
  2. <?php echo $row_Recordset1['tabB_1'.'warx']; ?>
  3. <?php echo $row_Recordset1['tabB_2'.'warx']; ?>


Oczywiście nie dało to pożądanego rezultatu.
Jak wyświetlić "warx" z tabeli "tabB", "warx" z tabeli "tabB_1", "warx" z tabeli "tabB_2"?
Z cała pewnością da się wyświetlić wszystkie dane z zapytania tylko moja wiedza jest zbyt płytka.
tomek_
np tak 

  1. <?php
  2. //poczatek tabeli
  3.  
  4. for($i=0;$i<$totalRows_Recordset1; $i++)
  5.  
  6. {
  7.  
  8. $row_Recordset1 = mysql_fetch_assoc($Recordset1);
  9.  
  10. //wyświetlenie kolejnych wierszy tak jak teraz wyświetlasz ten jeden
  11.  
  12. }
  13.  
  14. //koniec tabeli
  15. ?>
Bosmanircx
Problem w tym, że nie wszystkie dane chcą się wyświetlić.
dana:
Ida – Wyświetla się
war3 - Wyświetla się
warx – z TabB Wyświetla się
war1 - Wyświetla się
warx – z TabB_1 Nie wyświetla się
war2 - Wyświetla się
warx – z TabB_2 Nie wyświetla się

Ciekawostką jest to, że w PhpMyAdmin dane dobrze się wyświetlają.
Przyczyna kłopotów jest fakt, że zostały utworzone 2 aliasy (TabB_1 i Tabb_2) tabeli TabB.



Sprawa teoretycznie wygląda prosto dwie połączone tabele, z których trzeba wyświetlić dane. Komplikuje sprawę zapytacie SQL, które trzykrotnie wykorzystuje do zapytania te sama tabele. Za każdym razem tworząc nowe aliasy tabeli TabB. Mam nadzieje, że znajdzie się ktoś, kto spróbuje wpisać powyższe tabele do swojej bazy i wykonać zapytanie zarówno w PhpMyAdmin jak i we własnym kodzie PHP.

Można to potraktować jak pewnego rodzaju wyzwanie. Ja nie spodziewałem się, że będę miał kiedykolwiek z taka operacją kłopoty. Po prostu wcześniej nie miałem kontaktu z tak zagmatwanymi zapytaniami na stronie.

Z góry dziękuję wszystkim próbującym rozwiązać ten problem za poświęcony na to czas. blink.gif
nospor
nazwy kolumn sie nadpisuja. jak chcesz wyswietlic te samo kolumny z innych tabel, musisz nadac im aliasy:
  1. SELECT tab1.warx warx1, tab2.warx warx2 ....

I teraz twoje kolumny sa widziane pod warx1, warx2
Bosmanircx
Dziękuję ślicznie Panie nospor. To jest dokładnie ta odpowiedz jaka mi się marzyła. Widać od razu że mam do czynienia z fachowcem najwyższego szczebla.

A dla pozostałych, tych co się dopiero uczą, podaje zapytanie z przed porady Pana nospor.

  1. SELECT `tabA`.`ida` , `tabA`.`war3` , `tabB`.`warx` , `tabA`.`war1` , `tabA`.`war2` , `tabB_1`.`warx` , `tabB_2`.`warx`
  2. FROM `intranet`.`tabB` `tabB_2`
  3. RIGHT OUTER JOIN (`intranet`.`tabB` `tabB_1`
  4. RIGHT OUTER JOIN (`intranet`.`tabB` `tabB`
  5. RIGHT OUTER JOIN `intranet`.`tabA` `tabA` ON `tabB`.`idb` = `tabA`.`war1`
  6. ) ON `tabB_1`.`idb` = `tabA`.`war2`
  7. ) ON `tabB_2`.`idb` = `tabA`.`war3`



Po poradzie Pana nospor.

  1. SELECT `tabA`.`ida` , `tabA`.`war3` , `tabB`.`warx` `warx0` , `tabA`.`war1` , `tabA`.`war2` , `tabB_1`.`warx` `warx1` , `tabB_2`.`warx` `warx2`
  2. FROM `intranet`.`tabB` `tabB_2`
  3. RIGHT OUTER JOIN ( `intranet`.`tabB` `tabB_1`
  4. RIGHT OUTER JOIN ( `intranet`.`tabB` `tabB`
  5. RIGHT OUTER JOIN `intranet`.`tabA` `tabA` ON `tabB`.`idb` = `tabA`.`war1`
  6. ) ON `tabB_1`.`idb` = `tabA`.`war2`
  7. ) ON `tabB_2`.`idb` = `tabA`.`war3`
nospor
Widze obce są Ci obyczaje na forum to przy okazji tego tematu krótkie wyjaśnienie:
1) żaden "Pan". My tu wszyscy na równi, tak więc wystarczy "nospor"
2)
Cytat
Widać od razu że mam do czynienia z fachowcem najwyższego szczebla.
Odpowiedź na proste pytanie nie czyni z nikogo fachowcem najwyższego szczebla. Na przyszłość zwykłe "Dziękuję" wystarczy, bez żadnych dodatkowych przymiotników winksmiley.jpg

smile.gif
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.