Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL: DISTINCT bei einem benutzerdefinierten Feld? (https://www.delphipraxis.net/126885-mysql-distinct-bei-einem-benutzerdefinierten-feld.html)

blackdrake 4. Jan 2009 00:32

Datenbank: MySQL • Version: 4/5 • Zugriff über: Direkte PMA Abfrage

MySQL: DISTINCT bei einem benutzerdefinierten Feld?
 
Hallo.

Folgende Query schneidet einen Teil auf `hardwareid` heraus und listet alle Einträge.

SQL-Code:
SELECT `used_by` , SUBSTRING( `hardwareid` , 33, 32 ) AS `teil`
FROM `...`
ORDER BY `teil`
Gewünscht ist zusätzlich eine Filterung, bei der nur Einträge gezeigt werden, bei denen dieses herausgeschnittene Teil öfters als 1 Mal vorkommt.

Nun habe ich folgendes ausprobiert:

1) COUNT(`teil`) AS `vorkommen` (geht nicht)
Gewünscht: WHERE `vorkommen` > 1

2) DISTINCT(`teil`) und GROUP BY `teil`
Gewünscht: WHERE COUNT(DISTINCT(`teil`)) > 1

Beides funktioniert nicht, da `teil` ein benutzerdefiniertes und kein natives Feld ist.

Was kann ich tun?

Gruß
blackdrake

mkinzler 4. Jan 2009 09:50

Re: MySQL: DISTINCT bei einem benutzerdefinierten Feld?
 
Versuch es mal mit einer Derived Table

mjustin 4. Jan 2009 09:55

Re: MySQL: DISTINCT bei einem benutzerdefinierten Feld?
 
Zitat:

Zitat von blackdrake
Hallo.

Folgende Query schneidet einen Teil auf `hardwareid` heraus und listet alle Einträge.

SQL-Code:
SELECT `used_by` , SUBSTRING( `hardwareid` , 33, 32 ) AS `teil`
FROM `...`
ORDER BY `teil`
Gewünscht ist zusätzlich eine Filterung, bei der nur Einträge gezeigt werden, bei denen dieses herausgeschnittene Teil öfters als 1 Mal vorkommt.

Ich habe zwar nur InterBase / FireBird im Einsatz aber so sollte es mit Standard SQL auch in MySQL gehen:

SQL-Code:
SELECT `used_by` , SUBSTRING( `hardwareid` , 33, 32 ) AS `teil`
FROM `...`
GROUP BY `teil`, SUBSTRING( `hardwareid` , 33, 32 )
HAVING COUNT(*) > 1
Wenn man die Anzahl je Gruppe sehen möchte:

SQL-Code:
SELECT COUNT(*), `used_by` , SUBSTRING( `hardwareid` , 33, 32 ) AS `teil`
FROM `...`
GROUP BY `teil`, SUBSTRING( `hardwareid` , 33, 32 )
HAVING COUNT(*) > 1

blackdrake 4. Jan 2009 22:08

Re: MySQL: DISTINCT bei einem benutzerdefinierten Feld?
 
Hallo.

Vielen Dank, es hat funktioniert!

SQL-Code:
SELECT `used_by` , SUBSTRING( `hardwareid` , 33, 32 ) AS `teil`, COUNT(*) AS `vorkommen`
FROM `...`
GROUP BY `teil`, SUBSTRING( `hardwareid` , 33, 32 )
HAVING COUNT(*) > 1
Es ist irgendwie verwirrend, dass man bei einem GROUP BY bei einem "benutzerdefinierten (AS) Feld" sowohl den definierten Namen als auch die Definition schreiben muss, mit Kommas getrennt - wieso eigentlich?

Außerdem verstehe ich nicht, wieso man "HAVING COUNT(*) > 1" anstelle von "WHERE `vorkommen` > 1" schreibt... :?

Gruß
blackdrake

mkinzler 5. Jan 2009 05:32

Re: MySQL: DISTINCT bei einem benutzerdefinierten Feld?
 
HAVING wird Benutzt um Gruppierungen einzuschränken, WHERE für die ganze Ergebnismenge.
Die wenigtsen DBMS unterstützen es definierte Feld-Aliase in WHERE/HAVING zu verwenden

mjustin 5. Jan 2009 05:48

Re: MySQL: DISTINCT bei einem benutzerdefinierten Feld?
 
Zitat:

Zitat von blackdrake
Hallo.

Vielen Dank, es hat funktioniert!

SQL-Code:
SELECT `used_by` , SUBSTRING( `hardwareid` , 33, 32 ) AS `teil`, COUNT(*) AS `vorkommen`
FROM `...`
GROUP BY `teil`, SUBSTRING( `hardwareid` , 33, 32 )
HAVING COUNT(*) > 1
Es ist irgendwie verwirrend, dass man bei einem GROUP BY bei einem "benutzerdefinierten (AS) Feld" sowohl den definierten Namen als auch die Definition schreiben muss, mit Kommas getrennt - wieso eigentlich?

Eigentlich nicht - so sollte es eigenlich heissen:

SQL-Code:
SELECT `used_by` , SUBSTRING( `hardwareid` , 33, 32 ) AS `teil`, COUNT(*) AS `vorkommen`
FROM `...`
GROUP BY `used_by`, SUBSTRING( `hardwareid` , 33, 32 )
HAVING COUNT(*) > 1
Sorry für den Tippfehler


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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