Tabellen verknüpfen mit InnoDB

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tabellen verknüpfen mit InnoDB

    Hallo Leute,

    Ich habe zwei Tabellen:

    p_stocks (stock_id, stock_symbol, stock_name);
    p_history (history_id, stock_id, history_c, history_o);

    nun habe ich in InnoDB die p_history.stock_id mit der p_stocks.stock_id verknüpft, und funktioniert auch super.

    nun möcht ich aber gern eine abfrage machen.
    ich habe ein <input> feld wo man das symbol für die aktie eingeben kann, und nun möchte ich gerne alle historischen kurse von dieser aktie ausgeben.

    ich könnte es so realisieren:
    PHP-Code:
    $stockQuery "SELECT * FROM p_stocks WHERE stock_symbol=GOOG";
    $stockResult mysql_query($stockQuery);

    while (
    $row mysql_fetch_assoc($stockResult)) {
        
    $historyQuery "SELECT * FROM p_history WHERE stock_id=" $row['stock_id'];
        
    $historyResult mysql_query($historyQuery);

        while (
    $row1 mysql_fetch_assoc($historyResult)) {
            echo 
    $row['stock_symbol'] . ' : ' $row1['history_o']
                . 
    '-' $row1['history_c'] . '<br />';
        }

    das ist mir aber zu wenig elegant. kann ich das nicht mit einer sql abfrage machen?

    danke

    lg tom
    Zuletzt geändert von AmicaNoctis; 29.01.2010, 13:56.

  • #2
    Wie du Joins machst, weißt du aber schon, oder? Wenn nicht, hast du ja schon mal das Stichwort!
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      Danke dir, aber hab nun noch ein problem

      PHP-Code:
      <?php

      $connection 
      mysql_connect('localhost''root''blenialo');
      $db         mysql_select_db('project');

      $query "SELECT s.*, h.*, COUNT(*) AS cnt
                FROM p_history AS h 
                RIGHT JOIN p_stocks AS s ON (h.stock_id = s.stock_id) 
                WHERE s.stock_symbol='AACC'
                GROUP BY h.history_id"
      ;
                    
      $result mysql_query($query);

      while (
      $row mysql_fetch_assoc($result)) {
          echo 
      $row['cnt'] . ' : ' $row['stock_name'] . ' : ' $row['history_c']
              . 
      ' : ' $row['history_v'] . ' : ' $row['history_t'] . '<br />';
      }

      ?>
      die $row['cnt'] gibt mir immer 1 aus, warum?

      es sollten eigentlich 62 zeilen sein, die diese bedingungen erfüllen.

      danke, mfg tom
      Zuletzt geändert von AmicaNoctis; 29.01.2010, 13:57.

      Kommentar


      • #4
        Zitat von rundmc Beitrag anzeigen
        die $row['cnt'] gibt mir immer 1 aus, warum?
        Weil COUNT die Ergebnisse der Gruppierung zählt.

        Spalten zu selektieren, die nicht Bestandteil der Gruppierung sind, ist übrigens in SQL nicht erlaubt - MySQL lässt es lediglich durchgehen, wenn es entsprechend fehlertolerant eingestellt ist.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          danke.

          gibt es dann zumindest eine funktion so wie LIMIT nur von hinten?

          es sollen mir nur die letzten 10 ausgegeben werden, wo die WHERE klausel stimmt.

          danke

          Kommentar


          • #6
            Mit ORDER BY ... DESC kannst du absteigend nach ... sortieren.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              ja, das ist mir schon klar, aber so werden fängt er dann beim 2010-01-27 and hört beim 2010-01-17 auf.

              genau das möcht ich dann nochmal invertieren.

              Kommentar


              • #8
                Dann aggregiere das Ergebnis mit PHP in einem Array und benutze dann array_reverse. Anders geht es nicht oder du brauchst zwei Abfragen.

                Du möchtest jetzt bitte deinen Code auf 100 Zeichen umbrechen!
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  ok danke,

                  dann hab ich noch eine einzige frage an euch profis.

                  PHP-Code:
                  $query "SELECT s.*, h.*
                                FROM p_history AS h
                                RIGHT JOIN p_stocks AS s ON (h.stock_id = s.stock_id)
                                LIMIT 10"

                  gibt es für diese abfrage eine möglichkeit von jeder stock_id nur die letzten 10 history_t auszugeben.

                  in der p_history sind alle history daten gespeichert und in jeder zeile ist die jeweilige stock_id gespeichert, zu der die daten gehören.

                  jede aktie hat 62 einträge in der p_history, und jetzt möchte ich gern nur die letzten 10 history daten für jede aktie ausgeben.

                  geht sowas in MYSQL.

                  danke vielmals

                  Kommentar


                  • #10
                    Das geht nur mit einer Unterabfrage, aber nimm eine unkorrelierte!

                    Beispiel:

                    Code:
                    select *
                    from thread
                    join (
                    		select *
                    		from posting
                    		order by `date` desc
                    		limit 3
                    	) as p
                    	on p.thread_fkey = thread.id
                    order by thread.title, p.`date`;
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar

                    Lädt...
                    X