Select Abfrage mit Max....

Mari90

Grünschnabel
Hi,

ich habe folgendes Problem und ich hoffe ,dass mir hier jemand helfen kann.

Ich komme echt nicht weiter, bin auch kein Profi. Ich versuche meine Tabellen einfach darzustellen.

Ich habe drei Tabellen erstellt:

--------------------------------

Tabelle_kunde

Id (PK), Name, Adresse

1, John, München

2, Robert, Frankfurt

3, Sarah, Berlin

------------------------------------

Tabelle_Produkte

Id(PK), index(FK)

1, 564

2, 456

3, 111

-----------------------------------------

Tabelle_Kauf

Index(FK), timestamp

564 , 21.03.2017 09:21

-----------------------------------------------------------------

Die Tabelle wird durch Python ( insert into….ergänzt)

Ich möchte, dass ausgegeben wird:

Id, name, adresse, index und der neuste Timestamp.

Also dem Timestamp wird bestimmter index zugehören, der wiederrum ist auch in der Tabelle_produkte, und id , dadurch weiß ich wer das ist und woher er kommt.

Ich hoffe dass mir jeder folgen kann ;)

Das Problem ist, dass ich mit meiner sql Abfrage zwar immer den neusten timestamp sehe aber das ip ist immer 1 und alles was zu 1 gehört, was eigentlich nicht stimmt.

Select Tabelle_kunde.id, Tabelle_kunde.name, Tabelle_kunde.adresse, Tabelle_produkte.index, max(Tabelle_kauf.timestamp) from Tabelle_kunde, Tabelle_produkte, Tabelle_kauf whereTabelle_produkte.index=Tabelle_kauf. Index and Tabelle_produkte.id= Tabelle_kunde.id

grüße
Marie
 
Deine Erjklärung ist ein wenig undurchsichtig

Hier mal dein SQL in lesbarer Form
SQL:
Select
    Tabelle_kunde.id,
    Tabelle_kunde.name,
    Tabelle_kunde.adresse,
    Tabelle_produkte.index,
    max(Tabelle_kauf.timestamp)
from
    Tabelle_kunde,
    Tabelle_produkte,
    Tabelle_kauf
where
    Tabelle_produkte.index = Tabelle_kauf.Index
    and Tabelle_produkte.id = Tabelle_kunde.id

Zu deinem SQL:
Du hast ein MAX(). Das ist eine Aggregationsfunktion. Aber du hast keinerlei Gruppierungen. Ich nehme an, es handelt sich hier um MySql. Den diese macht den fatalen Fehler soche unvollständigen SQL zuzulassen. Das sorgt eher für Verwirrung als dass es hilft Probleme zu lösen

Und das ist, was MySQL daraus macht
SQL:
Select
    Tabelle_kunde.id,
    Tabelle_kunde.name,
    Tabelle_kunde.adresse,
    Tabelle_produkte.index,
    max(Tabelle_kauf.timestamp)
from
    Tabelle_kunde,
    Tabelle_produkte,
    Tabelle_kauf
where
    Tabelle_produkte.index = Tabelle_kauf.Index
    and Tabelle_produkte.id = Tabelle_kunde.id
group by
    Tabelle_kunde.id,
    Tabelle_kunde.name,
    Tabelle_kunde.adresse,
    Tabelle_produkte.index
Du siehst, er gruppier über den index. Solange du den index in der Auswahl hast, hast du immer alle Einträge aus den Produkten

Darum: Setze den Group By sauber. Entfenre das Feld index aus dem Select und dem Group By.
 
Vielen Dank,
ich habe ausprobiert und kann ich alle Kunden sehen.
Wenn ich dann jetzt eine Webseite mache, kann ich dann mit dem code in Php eine liste machen,
die mir chronologisch zeigt wer als nächster gekauft hat? Oder brauche ich anderen code?
 
kann mir jemand ein tipp geben wie ich eine vorlaufende Liste der Datenbank mit Php ausgeben kann?
ich kann nicht konkretes finden, meine Liste bleibt stehen und vergrössert sich nicht.
wenn der erste Kunde hintereinander 3 mal einkauft, sehe ich nur eine timestamp von ihn ......
 
es sieht bei mir so aus......
PHP:
<html>
<body>
<?php
$con = mysqli_connect("........");
$res = mysqli_query($con, "SELECT
    Tabelle_kunde.id,
    Tabelle_kunde.name,
    Tabelle_kunde.adresse,
    Tabelle_produkte.INDEX,
    MAX(Tabelle_kauf.zeit)
FROM
    Tabelle_kunde,
    Tabelle_produkte,
    Tabelle_kauf
WHERE
    Tabelle_produkte.INDEX = Tabelle_kauf.INDEX
    AND Tabelle_produkte.id = Tabelle_kunde.id
GROUP BY
    Tabelle_kunde.id,
    Tabelle_kunde.name,
    Tabelle_kunde.adresse,
    Tabelle_produkte.INDEX");

$menge = mysql_num_rows($res);
while ($row = mysqli_fetch_array ($res))
{
    echo $row["id"] . ","
    echo $row["name"] . ","
    echo $row["adresse"] . ","
    echo $row["index"] . ","
    echo $row["zeit"] . "</br>";
  
}
mysqli_close($con);
?>
</body>
</html>
 
Zuletzt bearbeitet von einem Moderator:
es sieht bei mir so aus...
PHP:
<html>
<body>
<?php
$con = mysqli_connect("........");
$res = mysqli_query($con, "SELECT
    Tabelle_kunde.id,
    Tabelle_kunde.name,
    Tabelle_kunde.adresse,
    Tabelle_produkte.INDEX,
    MAX(Tabelle_kauf.zeit)
FROM
    Tabelle_kunde,
    Tabelle_produkte,
    Tabelle_kauf
WHERE
    Tabelle_produkte.INDEX = Tabelle_kauf.INDEX
    AND Tabelle_produkte.id = Tabelle_kunde.id
GROUP BY
    Tabelle_kunde.id,
    Tabelle_kunde.name,
    Tabelle_kunde.adresse,
    Tabelle_produkte.INDEX");

$menge = mysql_num_rows($res);
while ($row = mysqli_fetch_array ($res))
{
   echo $row["id"] . ","
   echo $row["name"] . ","
   echo $row["adresse"] . ","
   echo $row["index"] . ","
   echo $row["zeit"] . "</br>";
  
}
mysqli_close($con);
?>
</body>
</html>
 
Zuletzt bearbeitet von einem Moderator:
Ich kann den Fehler nicht finden.
Der PHP-Code sieht fast gut aus. Du hast noch immer mysql_ drin (Zeile 24) Das sollte eigentlich einen Fehler werfen, da du mit ein mysqli_ result einem mysql_ Befehl übergibst.

zu deinem eigentlichen Problem. Ich denke, das SQL ist noch nicht das, was du brauchst.
Mach mal Beispieldaten die mehr als nur eine Zeile ausgeben sollten. Dann postest du noch das gewünschte Resultat dazu.
 
danke für deine Antwort,
ich habe jetzt statt group by......, order by kauf.zeit geschrieben und funktioniert. Es bildet sich eine vorlaufende Liste auf der Webseite :)
und statt max(zeit.kauf) einfach zeit.kauf
 
Zurück