Inner join Max id

  • PHP

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von schnibli.

    Inner join Max id

    Hallo zusammen,
    Ich habe mir eine Innerjoin Abfrage gebastelt:

    Quellcode

    1. $sql = "SELECT p.id, p.bezeichnung, p.sensor, m.temp, m.hum, m.id_sensor
    2. FROM indoor_sensoren p
    3. JOIN temp_int m ON m.id_sensor = p.sensor
    4. GROUP BY p.sensor
    5. ";
    6. //require_once('dbConnect.php');
    7. $r = mysqli_query($con,$sql);
    8. $result = array();
    9. while($row = mysqli_fetch_array($r)){
    10. array_push($result,array(
    11. 'id'=>$row['id'],
    12. 'bezeichnung'=>$row['bezeichnung'],
    13. 'sensor'=>$row['sensor'],
    14. 'temp'=>$row['temp'],
    15. 'hum'=>$row['hum'],
    16. ));
    17. }
    18. echo json_encode(array('result'=>$result));

    Die Abfrage Funktioniert soweit auch. nun ist das Problem das es den ältesten Datensatz der Tabelle temp_int anzeigt.
    Wie kann ich die abfrage abändern sodass der Datensatz mit der grössten id ausgelesen wird?
    Hi,

    einfach noch ein ORDER BY `p`.`id` DESC an dein SQL anhängen (also absteigend nach id sortieren) und feddich (Info: ORDER BY kommt immer nach GROUP BY).

    Mit PDO (empfohlen) würde dein Code so ausschauen:

    PHP-Quellcode

    1. <?php
    2. $sql = "SELECT p.id, p.bezeichnung, p.sensor, m.temp, m.hum, m.id_sensor
    3. FROM indoor_sensoren p
    4. JOIN temp_int m ON m.id_sensor = p.sensor
    5. GROUP BY p.sensor ORDER BY `p`.`id`
    6. ";
    7. // require_once('dbConnect.php');
    8. $pdo = new \PDO("mysql:host=localhost;dbname=DB_NAME", "DB_USER", "DB_PASS", [\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC]);
    9. $r = $pdo->query($sql)->fetchAll();
    10. $result = [];
    11. foreach ($r as $row) {
    12. $result[] = [
    13. 'id' => $row['id'],
    14. 'bezeichnung' => $row['bezeichnung'],
    15. 'sensor' => $row['sensor'],
    16. 'temp' => $row['temp'],
    17. 'hum' => $row['hum'],
    18. ];
    19. }
    20. echo json_encode(['result' => $result]);


    Beachte, dass beim PDO Code die foreach Schleife komplett unnötig ist, denn $r ist identisch mit $result nach dem Schleifendurchlauf, also kannst du auch direkt mit $r arbeiten, bzw. musst du nur $result = $r; schreiben um das gleiche Ergebnis zu erzielen.

    Somit ist der obige PDO Code identisch mit dem hier:

    PHP-Quellcode

    1. <?php
    2. $sql = "SELECT p.id, p.bezeichnung, p.sensor, m.temp, m.hum, m.id_sensor
    3. FROM indoor_sensoren p
    4. JOIN temp_int m ON m.id_sensor = p.sensor
    5. GROUP BY p.sensor ORDER BY `p`.`id`
    6. ";
    7. $pdo = new \PDO("mysql:host=localhost;dbname=DB_NAME", "DB_USER", "DB_PASS", [\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC]);
    8. $result = $pdo->query($sql)->fetchAll();
    9. echo json_encode(['result' => $result]);


    Kleiner Tipp: benutze Backticks für Spaltennamen ("Tabellenattribute"), also SELECT `field` FROM `table` statt SELECT field FROM table.


    Link :thumbup:
    Hello World

    Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „Link“ ()

    Hallo Link

    Ich habe leider mein Problem nicht genau genug erläutert jedoch vielen dank für deine Hilfreichen tipps!

    Ich habe eine Tabelle "indoor_sensoren" und eine Tabelle "temp_int"
    In der Tabelle "indoor_sensoren" sind alle Sensoren erfasst die Daten loggen. In der Tabelle "temp_int" werden die Daten der Sensoren gespeichert.

    Nun ist das lese ich mit der Abfrage alle indoor_sensoren aus und suche (indoor_sensoren.sensor = temp_int.id_sensor) die Werte zu den Sensoren in der Tabelle "temp_int".

    Alle Sensoren werden aufgelistet nur hollt er mir nicht den aktuellsten wert des Zugehörigen Sensors aus der Tabelle "temp_int" sondern der äleste.

    ich habe z.b. den in der "indoor_sensor" tabelle den eintrag

    id ¦ bezeichnung ¦ sensor
    1 ¦ wohnzimmer ¦ 1
    2 ¦ schlafzimmer¦ 2

    Und einträge wie folgt in der temp_int tabell:
    id ¦ temp ¦ hum ¦ id_sensor¦ datum
    1 ¦ 12¦ 14¦ 1¦ 10.11.2018
    2 ¦ 13¦ 15¦ 2¦ 10.11.2018
    3 ¦ 22¦ 24¦ 1¦ 11.11.2018
    4 ¦ 23¦ 25¦ 2¦ 11.11.2018

    Nun list er mir zu den Sensoren nicht die ID (" 3 +4 " ) aus (da dies die aktuellsten sind)
    sondern id ("1+2") also die ersten der Tabelle.

    ich hoffe du kannst mir helfen