Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Pobieranie danychz bazy
Forum PHP.pl > Forum > Przedszkole
psychol1986
Witam mam taki problem, mam 2 tabele

rates - przetrzymuje nazwy walut
currencies - przetrzymuje daty, wartości walut i id waluty

Wybrałem sobie wszystkie dane takim zapytaniem:

select currencies.name, rates.date, rates.rate from currencies, rates where rates.currency_id = currencies.id

I teraz chciałbym wyprodukować taką oto tabelkę

nazwa waluty | data początkowa | wartość dla daty początkowej | data końcowa | wartość dla daty końcowej

jednak nie mogę sobie z tym poradzić bo każdy wiersz z zapytania to osobna tablica. Od razu mówie że w tabeli rates jest kilka odwolan do jednej waluty z tabeli currencies. Sprawa pewnie jest prosta ale jestem początkujący wiec.... Będę wdzięczny za pomoc.
tehaha
pokaż kod i umieść w bbcode
psychol1986
  1. $link = mysql_connect($host, $user, $pass);
  2. if(!$link){
  3. echo 'Błąd połączenia z bazą';die;
  4. }
  5. mysql_select_db($db_name);
  6.  
  7. mysql_query("SET NAMES utf8");
  8.  
  9. $query = 'select currencies.name, rates.date, rates.rate from currencies, rates where rates.currency_id = currencies.id';
  10. $result = mysql_query($query);
  11.  
  12.  
  13.  
  14. ?>
  15.  
  16.  
  17. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  18. <html>
  19. <head>
  20. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  21. <title></title>
  22. </head>
  23. <body>
  24. <table>
  25. <tr>
  26. <td>Pole 1</td>
  27. <td>Pole 2</td>
  28. <td>Pole 3</td>
  29. </tr>
  30.  
  31. <?php
  32. while($row = mysql_fetch_assoc($result))
  33. {
  34. echo '<tr>';
  35. echo '<td>'.$row['name'].'</td>';
  36. echo '<td>'.$row['date'].'</td>';
  37. echo '<td>'.$row['rate'].'</td>';
  38. echo '</tr> ';
  39. }
  40. ?>
  41.  
  42. </table>
  43. </body>
  44. </html>


a tabele wyglądają tak:

  1. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  2.  
  3. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  4. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  5. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  6. /*!40101 SET NAMES utf8 */;
  7.  
  8.  
  9. CREATE TABLE IF NOT EXISTS `currencies` (
  10. `id` int(11) NOT NULL AUTO_INCREMENT,
  11. `code` char(3) NOT NULL,
  12. `name` varchar(32) NOT NULL,
  13. PRIMARY KEY (`id`)
  14. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
  15.  
  16. INSERT INTO `currencies` (`id`, `code`, `name`) VALUES
  17. (1, 'USD', 'United States dollar'),
  18. (2, 'JPY', 'Japanese yen'),
  19. (3, 'GBP', 'Pound sterling'),
  20. (4, 'PLN', 'Polish zloty'),
  21. (5, 'CAD', 'Canadian dollar');
  22.  
  23. CREATE TABLE IF NOT EXISTS `rates` (
  24. `id` int(11) NOT NULL AUTO_INCREMENT,
  25. `currency_id` int(11) NOT NULL,
  26. `date` date NOT NULL,
  27. `rate` decimal(8,5) NOT NULL,
  28. PRIMARY KEY (`id`)
  29. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ;
  30.  
  31. INSERT INTO `rates` (`id`, `currency_id`, `date`, `rate`) VALUES
  32. (1, 1, '2010-02-02', '1.32601'),
  33. (2, 2, '2010-02-02', '119.27520'),
  34. (3, 3, '2010-02-02', '0.88664'),
  35. (4, 4, '2010-02-02', '4.00257'),
  36. (5, 5, '2010-02-02', '1.58608'),
  37. (6, 1, '2010-02-03', '1.33940'),
  38. (7, 2, '2010-02-03', '120.48000'),
  39. (8, 3, '2010-02-03', '0.89560'),
  40. (9, 4, '2010-02-03', '4.04300'),
  41. (10, 5, '2010-02-03', '1.60210'),
  42. (11, 1, '2010-04-08', '1.32960'),
  43. (12, 2, '2010-04-08', '123.76000'),
  44. (13, 3, '2010-04-08', '0.87500'),
  45. (14, 4, '2010-04-08', '3.84980'),
  46. (15, 5, '2010-04-08', '1.34070');
  47.  
  48.  
tehaha
i co dokładnie nie działa, nie zwraca wyników czy co? zapytanie lepiej zrobić z JOIN ale tak chyba też się da, jeżeli nie zwraca wyników to sprawdź czy zapytanie nie zwraca błędu zamień
  1. $result = mysql_query($query);
na
  1. $result = mysql_query($query) or die(mysql_error());
psychol1986
Zapytanie zwraca dane tylko każdy wiersz jest jako osobny array, a ja potrzebuję wyświetlić dla każdej z walut date kiedy pierwszy raz wpadla i jaka byla wartosc i date z jaka ostatnio wpadla i jaka jest wartosc oczywiscie to wszystko w jednym wierszu.
neo1986kk
  1. $query = 'select currencies.name, rates.date, rates.rate from currencies, rates where rates.currency_id = currencies.id group by currencies.id ';
  2.  


potem musisz poszukać max date, tak mi się wydaje
psychol1986
Nie mogę dać group by bo wtedy wyświetli mi wyniki tylko dla jednego dnia a tam dla kazdej waluty jest po 3 różne wartości dla 3 różnych dni.
neo1986kk
ale chcesz wyświetlić tylko początkowe i koncowe czy wszystkie 3?
psychol1986
Tylko koncowe i poczatkowa. Tabela powinna wyglądać następująco:
  1. <tr>
  2. <td>Nazwa</td>
  3. <td>Data poczatkowa</td>
  4. <td>Wartosc dla daty poczatkowej</td>
  5. <td>Data koncowa</td>
  6. <td>Wartosc dla daty koncowej</td>
  7. <td>Róznica w %</td>
  8. </tr>
  9. <tr>
  10. <td>Polski Złoty</td>
  11. <td>2010-02-03</td>
  12. <td>123</td>
  13. <td>2010-02-08</td>
  14. <td>139</td>
  15. <td>Różnica</td>
  16. </tr>
  17. <tr>
  18. <td>Dolar amerykanski</td>
  19. <td>2010-02-01</td>
  20. <td>120</td>
  21. <td>2010-02-06</td>
  22. <td>129</td>
  23. <td>Różnica</td>
  24. </tr>

i tak dla kazdej waluty. Z tym że tak jak mówię jest tak że w tabeli rates np. dla polskiego zlotego mamy wartości dla 3 dni, a mi potrzebne są tylko te z najwcześniejszego dnia i z ostatniego jaki wpadł do bazy.
neo1986kk
No dobra a początkowy to jest o id 1 czy w tym momencie początkowy to końcowy -1

chodzi o to że jeśli masz tabele

Id Waluta DataPoczątkowa
1 1 02-02-2011
2 1 02-03-2011
3 1 02-04-2011
4 1 02-05-2011

To data początkowa zawsze jest ta z id 1 czyli data początkowa to id=1 a koncowa id=4, czy w tym momencie data początkowa to id=3 a koncowa id=4
psychol1986
Tak dokładnie tak, tabela wygląda tak:
  1. <table caption="rates (15 rows)">
  2. <tr>
  3. <th class="col0">id</th>
  4. <th class="col1">currency_id</th>
  5. <th class="col2">date</th>
  6. <th class="col3">rate</th>
  7. </tr>
  8. </thead>
  9. <tr>
  10. <td class="col0">1</td>
  11. <td class="col1">1</td>
  12. <td class="col2">2010-02-02</td>
  13. <td class="col3">1.32601</td>
  14. </tr>
  15. <tr>
  16. <td class="col0">2</td>
  17. <td class="col1">2</td>
  18. <td class="col2">2010-02-02</td>
  19. <td class="col3">119.27520</td>
  20. </tr>
  21. <tr>
  22. <td class="col0">3</td>
  23. <td class="col1">3</td>
  24. <td class="col2">2010-02-02</td>
  25. <td class="col3">0.88664</td>
  26. </tr>
  27. <tr>
  28. <td class="col0">4</td>
  29. <td class="col1">4</td>
  30. <td class="col2">2010-02-02</td>
  31. <td class="col3">4.00257</td>
  32. </tr>
  33. <tr>
  34. <td class="col0">5</td>
  35. <td class="col1">5</td>
  36. <td class="col2">2010-02-02</td>
  37. <td class="col3">1.58608</td>
  38. </tr>
  39. <tr>
  40. <td class="col0">6</td>
  41. <td class="col1">1</td>
  42. <td class="col2">2010-02-03</td>
  43. <td class="col3">1.33940</td>
  44. </tr>
  45. <tr>
  46. <td class="col0">7</td>
  47. <td class="col1">2</td>
  48. <td class="col2">2010-02-03</td>
  49. <td class="col3">120.48000</td>
  50. </tr>
  51. <tr>
  52. <td class="col0">8</td>
  53. <td class="col1">3</td>
  54. <td class="col2">2010-02-03</td>
  55. <td class="col3">0.89560</td>
  56. </tr>
  57. <tr>
  58. <td class="col0">9</td>
  59. <td class="col1">4</td>
  60. <td class="col2">2010-02-03</td>
  61. <td class="col3">4.04300</td>
  62. </tr>
  63. <tr>
  64. <td class="col0">10</td>
  65. <td class="col1">5</td>
  66. <td class="col2">2010-02-03</td>
  67. <td class="col3">1.60210</td>
  68. </tr>
  69. <tr>
  70. <td class="col0">11</td>
  71. <td class="col1">1</td>
  72. <td class="col2">2010-04-08</td>
  73. <td class="col3">1.32960</td>
  74. </tr>
  75. <tr>
  76. <td class="col0">12</td>
  77. <td class="col1">2</td>
  78. <td class="col2">2010-04-08</td>
  79. <td class="col3">123.76000</td>
  80. </tr>
  81. <tr>
  82. <td class="col0">13</td>
  83. <td class="col1">3</td>
  84. <td class="col2">2010-04-08</td>
  85. <td class="col3">0.87500</td>
  86. </tr>
  87. <tr>
  88. <td class="col0">14</td>
  89. <td class="col1">4</td>
  90. <td class="col2">2010-04-08</td>
  91. <td class="col3">3.84980</td>
  92. </tr>
  93. <tr>
  94. <td class="col0">15</td>
  95. <td class="col1">5</td>
  96. <td class="col2">2010-04-08</td>
  97. <td class="col3">1.34070</td>
  98. </tr>
  99. </tbody>
  100. </table>
  101.  
  102.  
neo1986kk
reasumując chcesz pobrać id=4 i id=14 w tym konkretnym przpadku, mówimy narazie tylko o PLNach,

Czy pobierasz początkowe id

  1. SELECT * FROM tabela WHERE currency_id=4


czyli pobiera Ci:
4
9
14

  1. SELECT * FROM TABLE WHERE currency_id=4 GROUP BY currency_id


daje

4 - czyli początkowy

  1. SELECT * FROM TABLE WHERE currency_id=4 GROUP BY currency_id ORDER BY id DESC


daje

14- czyli koncowy

Nie sprawdzałem tego ale o ile pamiętam coś takiego powinno działać w przedstawiony sposób.

teraz by trzeba było coś wymyślić dla kazdego currency_id i najlepiej zamknąć w jednym zapytaniu

  1. SELECT * FROM TABLE GROUP BY currency_id


daje nam początkowe
1
2
3
4

  1. SELECT * FROM TABLE GROUP BY currency_id ORDER BY id DESC


daje nam koncowe
15
14
13
12
11

Dalej trzeba to połączyć w jedno zapytanie i nie wiem właściwie czy Union czy Join bo sam mam problemy tego typu zapytaniami


tehaha
@neo1986kk to co napisałeś jest nie poprawne, ponieważ ORDER BY działa po GROUP BY

do autora:
musisz to zrobić przy pomocy 2 zapytań, być może dałoby się pokombinować z podzapytaniami ale to nie zawsze jest dobre wyjście.

Jednym zapytaniem wyłapiesz wartość dla najwyższej daty, drugim dla najniższej, wszystko umieszczasz w tablicy a potem sobie to wyświetlisz jak chcesz;

mniej więcej coś takiego:
  1. $data = array();
  2. $sql = 'SELECT id, currency_id, MIN(date) as min, rate, date FROM rates GROUP BY currency_id';
  3. while($row = mysql_fetch_assoc)
  4. {
  5. if(!isset($data[$row['currency_id']])) $data[$row['id']]= array();
  6. $data[$row['currency_id']]['min'] = array('date'=>$row['min'], 'rate'=>$row['rate']);
  7. }
  8.  
  9. $sql = 'SELECT id, currency_id, MAX(date) as max, rate, date FROM rates GROUP BY currency_id';
  10. while($row = mysql_fetch_assoc)
  11. {
  12. if(!isset($data[$row['currency_id']])) $data[$row['id']]= array();
  13. $data[$row['currency_id']]['max'] = array('date'=>$row['max'], 'rate'=>$row['rate']);
  14. }
  15. print_r($data);
psychol1986
Super wielkie dzieki!!! o to chodziło!!:)
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.