Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit Query (https://www.delphipraxis.net/112483-problem-mit-query.html)

MaxMara 22. Apr 2008 09:37

Datenbank: MySQL • Version: 5 • Zugriff über: Zeoslib

Problem mit Query
 
Hallo!
Ich hätte da ein Problem mit einem Query:
In einem Table sind einige Felder für ein Voting. Jetzt können die Leute so oft abstimmen wie sie möchten, aber ich möchte trotzdem nur die letzte Stimme anhand der IP-Adresse zählen. (Ich weiss, dass IP-Adressen nicht unbedingt statisch sein müssen, aber das ist hier nicht das Thema ). Ohne diese IP-Beschränkung sieht mein Query wie folgt aus:
SQL-Code:
SELECT voting_text, count(*) AS `ergebnis` FROM `data` group by `voting_text`
Nur wie müsste es aussehen, wenn ich immer nur die letzte gespeicherte IP-Adresse werten möchte?

Danke für eure Hilfe.
Christian.

mkinzler 22. Apr 2008 09:45

Re: Problem mit Query
 
Wo steht den die IP-Adresse?

MaxMara 22. Apr 2008 09:51

Re: Problem mit Query
 
Ah. Wäre vielleicht eine interessante Info - Sorry :)

Ist im gleichen Table unter voting_ip drin.

mkinzler 22. Apr 2008 09:55

Re: Problem mit Query
 
Versuch es mal mit:
SQL-Code:
SELECT voting_text, count(ID) AS `ergebnis` FROM ( Select FIRST( ID)`data` from `data` group by `voting_ip`) group by `voting_text`;

DeddyH 22. Apr 2008 10:03

Re: Problem mit Query
 
Für die "letzte" Stimme fehlt aber IMHO noch ein Zeitkriterium (DATETIME-Feld) :gruebel:

MaxMara 22. Apr 2008 10:06

Re: Problem mit Query
 
Zitat:

Zitat von DeddyH
Für die "letzte" Stimme fehlt aber IMHO noch ein Zeitkriterium (DATETIME-Feld) :gruebel:

Ja, die wird auch gespeichert unter voting_date (datetime). Ich hätte es wie mkinzler über die ID (voting_id) gemacht.


Zitat:

Zitat von mkinzler
Versuch es mal mit:
SQL-Code:
SELECT voting_text, count(ID) AS `ergebnis` FROM ( Select FIRST( ID)`data` from `data` group by `voting_ip`) group by `voting_text`;

Anscheinend kennt MySQL "FIRST" nicht. Habe es mal statt dessen mit MAX probiert. Ergebnis war folgender Fehler: ERROR 1248 (42000): Every derived table must have its own alias

DeddyH 22. Apr 2008 10:10

Re: Problem mit Query
 
Schau Dir mal meinen "Lieb-Link" an :)

MaxMara 22. Apr 2008 10:42

Re: Problem mit Query
 
Zitat:

Zitat von DeddyH
Schau Dir mal meinen "Lieb-Link" an :)

Ja, der könnte mir schon weiterhelfen - aber irgendwie schaff ich es nicht das auf mein Problem umzulegen :(

DeddyH 22. Apr 2008 10:59

Re: Problem mit Query
 
Zitat:

Jetzt können die Leute so oft abstimmen wie sie möchten, aber ich möchte trotzdem nur die letzte Stimme anhand der IP-Adresse zählen.
Könntest Du mir diesen Satz nochmal erklären?

mkinzler 22. Apr 2008 11:02

Re: Problem mit Query
 
Er möchte, wenn von einer IP-Adresse mehrere Votings erfolgt sind, nur die letzte werten.

MaxMara 22. Apr 2008 11:07

Re: Problem mit Query
 
Danke mkinzler :)

DeddyH 22. Apr 2008 11:08

Re: Problem mit Query
 
Dann kommt beim count aber immer 1 heraus.

[edit] Oder ist die Gesamtanzahl der unterschiedlichen IPs gemeint? [/edit]

mkinzler 22. Apr 2008 11:14

Re: Problem mit Query
 
Zitat:

[edit] Oder ist die Gesamtanzahl der unterschiedlichen IPs gemeint? [/edit]
Wohl eher dass. Ist aber leider nicht trivial

MaxMara 22. Apr 2008 11:14

Re: Problem mit Query
 
Zitat:

Zitat von DeddyH
Dann kommt beim count aber immer 1 heraus.

[edit] Oder ist die Gesamtanzahl der unterschiedlichen IPs gemeint? [/edit]

Ja. Es geht mir um die Gesamtanzahl der unterschiedlichen IPs pro "Vote".

mkinzler 22. Apr 2008 11:33

Re: Problem mit Query
 
SQL-Code:
SELECT voting_text, count(ID) AS ergebnis FROM ( Select voting_text, MAX( ID) as ID from data group by voting_ip, voting_text) group by voting_text;

MaxMara 22. Apr 2008 12:06

Re: Problem mit Query
 
Zitat:

Zitat von mkinzler
SQL-Code:
SELECT voting_text, count(ID) AS ergebnis FROM ( Select voting_text, MAX( ID) as ID from data group by voting_ip, voting_text) group by voting_text;

Geht leider nicht:
ERROR 1248 (42000): Every derived table must have its own alias

mkinzler 22. Apr 2008 12:11

Re: Problem mit Query
 
Dann verpasse ihm doch einen Alias

MaxMara 22. Apr 2008 12:15

Re: Problem mit Query
 
Und wie soll das aussehen?
Sorry, aber das ist mir echt ein wenig zu hoch...

mkinzler 22. Apr 2008 12:16

Re: Problem mit Query
 
SQL-Code:
SELECT a.voting_text, a.count(ID) AS ergebnis FROM ( Select voting_text, MAX( ID) as ID from data group by voting_ip, voting_text) a group by a.voting_text;

MaxMara 22. Apr 2008 12:28

Re: Problem mit Query
 
Habs grad probiert. Gibt ein falsches Ergebnis aus - die doppelten IPs werden trotzdem gezählt.

mkinzler 22. Apr 2008 12:32

Re: Problem mit Query
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe das in FB getestet da macht die Abfrage, was sie soll :gruebel:

MaxMara 22. Apr 2008 12:47

Re: Problem mit Query
 
Sehr seltsam.
Vielleicht liegt es daran, dass MySQL nichts mit a.count(ID) anfangen kann?
(ERROR 1305: FUNCTION a.count does not exist)

mkinzler 22. Apr 2008 12:49

Re: Problem mit Query
 
Sorry der Alias gehört natürlich in die Klammer
SQL-Code:
SELECT a.voting_text, count(a.ID) AS ergebnis FROM ( Select voting_text, MAX( ID) as ID from data group by voting_ip, voting_text) a group by a.voting_text;

MaxMara 22. Apr 2008 13:30

Re: Problem mit Query
 
Also bei mir sieht es jetzt so aus:
SQL-Code:
mysql> SELECT a.voting_text, count(a.ID) AS ergebnis FROM ( Select voting_text, MAX(voting_id) as ID from data group by voting_ip, voting_text) a group by a.voting_text;
geändert von mir wurde lediglich das
SQL-Code:
MAX(voting_id) as ID ...
weil wenn ich nur MAX(ID) hier nehme bringt er den Fehler "Unknown column 'ID' in 'field list'"

Auf jeden Fall bringt "mein" SQL nicht den gewünschten Effekt.

Im Übrigen möcht ich mich schon mal für den Einsatz bedanken! Find ich echt toll! Danke!

mkinzler 22. Apr 2008 13:39

Re: Problem mit Query
 
Führe mal nur die innere Abfrage aus und lass dir das Ergebnis anzeigen

MaxMara 22. Apr 2008 13:43

Re: Problem mit Query
 
Das hier:

Code:
+-------------+------+
| voting_text | ID  |
+-------------+------+
| Ja         |    2 |
| Ja         |    1 |
| Nein       |    3 |
+-------------+------+

mkinzler 22. Apr 2008 13:45

Re: Problem mit Query
 
Wie sieht die komplette Tabelle dazu aus?

MaxMara 22. Apr 2008 13:50

Re: Problem mit Query
 
so:
Code:
+-----------+---------------------+-------------+-----------+
| voting_ip | voting_date        | voting_text | voting_id |
+-----------+---------------------+-------------+-----------+
| 10.0.60.1 | 2008-04-21 11:43:00 | Ja         |         1 |
| 10.0.60.2 | 2008-04-21 11:40:00 | Ja         |         2 |
| 10.0.60.1 | 2008-04-21 15:13:00 | Nein       |         3 |
+-----------+---------------------+-------------+-----------+

mkinzler 22. Apr 2008 13:55

Re: Problem mit Query
 
Ok. Ich Gruppiere ja nach Text und ID

SQL-Code:
SELECT a.voting_text, count(a.ID) AS ergebnis FROM
(select c.voting_text, MAX(b.voting_id) as ID from data b join data c on c.id = b.ID group by voting_ip) a
group by a.voting_text;

MaxMara 22. Apr 2008 13:58

Re: Problem mit Query
 
ERROR 1054 (42S22): Unknown column 'c.id' in 'on clause'

mkinzler 22. Apr 2008 14:01

Re: Problem mit Query
 
SQL-Code:
SELECT a.voting_text, count(a.ID) AS ergebnis FROM
(select c.voting_text, MAX(b.voting_id) as ID from data b join data c on c.voting_id = b.voting_id group by b.voting_ip) a
group by a.voting_text;

MaxMara 22. Apr 2008 14:12

Re: Problem mit Query
 
Jetzt funktioniert es schon "besser":
Ich bekomme jedoch für Antwort "Ja" bei ergebnis 2.
Eigentlich sollte es 1 bei Ja und 1 bei Nein sein.

mkinzler 30. Apr 2008 11:21

Re: Problem mit Query
 
So sollte es funktionieren:
SQL-Code:
SELECT a.voting_text, count(a.voting_ip) AS ergebnis FROM
(
   select
       distinct( c.voting_ip), max(c.voting_text) as voting_text
   from
       data b
           join data c on c.voting_ip = b.voting_ip
   group by
       c.voting_ip) a
group by a.voting_text;

MaxMara 30. Apr 2008 13:54

Re: Problem mit Query
 
Danke, hab es jetzt (mit Hilfe eines Freundes) so gelöst:
SQL-Code:
SELECT t1.voting_text, count(*) AS `ergebnis` 
FROM `data` t1 
LEFT JOIN `data` t2 
ON t1.voting_ip = t2.voting_ip
AND t1.voting_date < t2.voting_date
WHERE t2.voting_id IS NULL
GROUP BY t1.voting_text;
Danke an alle Mitdenker :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz