php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.12.2006, 14:16  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard UNION und GROUP BY

Hallo,

ich habe 2 Tabellen.

Code:
Tabelle Name:
id | name

Tabelle zweitername:
id | zuname | zweitname
Jetzt benötige ich alle Sätze als eine Tabelle auszugeben und dabei zu sehen wieoft ein Name eingetragen ist.

Code:
(SELECT d.name AS Name
  FROM name n)
UNION ALL
(SELECT z.zweitname AS Name
  FROM zweitername z)
ORDER BY Name ASC;
Das gibt mir jetzt schon mal alle Namen aus beiden Tabellen zusammengefügt zurück. Jetzt würde ich (wenn es nur ein SELECT wäre) mit "GROUP BY Name" arbeiten und mit einen "COUNT(name) AS anzahl" einbauen um die Anzahl der eingetragenen Namen zu ermitteln. Leider weiß ich bei UNION nicht genau wie das geht. Die SQL-Referenz hält sich leider etwas bedeckt und auch google gibt keine Beispiele für meinen Bedarf.

Hat jemand einen Ansatz für mich?

Danke,
Stefan
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.12.2006, 14:45  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ja, benutz nur UNION und nicht UNION ALL.
Zergling-new ist offline   Mit Zitat antworten
Alt 06.12.2006, 14:55  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard

Das GROUP BY wollte ich, damit ich damit ich COUNT benutzen kann. Wenn ich das ALL weglasse, dann bekomme ich jeden Satz einmal. Nur wie bekomme ich im gleichen Zug raus, wie oft jeder Satz vorhanden ist?

Beispiel:
Code:
Tabelle Name:
id | name
-----------
1 | Sepp
2 | Franz
3 | Sepp
....

Tabelle zweitername:
id | zuname | zweitname 
-----------------------------
1 | 1 | Franz
2 | 1 | Sepp
3 | 1 | Sepp
4 | 2 | Sepp
....
Gewünschtes Ergebnis:
Code:
Name | Anzahl
-------------------
Sepp | 5
Franz | 2
....
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline   Mit Zitat antworten
Alt 06.12.2006, 15:07  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ich wüßte nicht, wie das mit MySQL geht (das heißt nicht, dass es nicht geht).
Mach dir kein Kopf darum:
Kapsel [1] die Abfrage gut und lös es "irgendwie", notfalls mit 2 Abfragen, die du mit PHP kombinierst.
Wenn dir später eine performantere Lösung zukommt, kannst du den Code ja dank der Kapselung [1] einfach austauschen.

[1] http://de.wikipedia.org/wiki/Datenkapselung_(Programmierung)
Zergling-new ist offline   Mit Zitat antworten
Alt 06.12.2006, 15:17  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard

Ich hab grade in einen portugisischen Forum etwas gefunden, das das Problem löst. Leider bin ich etwas eingerostet in der Sprache. Der Lösungsweg geht über eine temporäre Tabelle. Erst alle Sätze dort eintragen und dann per GROUP BY und COUNT arbeiten. Ist allerdings nicht sehr entspannend für die Datenbank, da ich mehrere Querys benötigt.

Auch schreibt einer man soll es über einen SUB-SELECT order JOIN machen.

Momentan läse ich es mit PHP. Ich lasse mir alle Einträge sortier nach Name ausgeben.
If (Name==Letzter_Name) zähle mit.
If (Name!==Letzter Name) gibs aus und setzte zähler auf 0!

Ist jetzt nicht meine Traumläsung, aber es geht!
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline   Mit Zitat antworten
Alt 06.12.2006, 17:06  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Wollte dir grade antworten, leider hab ich es geschafft, die Tastatur mit einer genialen Tastenkombination auf amerikanisch zu stellen. Kein Plan wo man das jetzt zurueckstellt, bei Systemsteuerung - Tastatur schonmal nicht..

Soweit bin ich gekommen:
Mit JOIN und Sub-SELECTs kann es möglicherweise schnell an Performance einbüßen.

[php]<?php
$sSQL = array();
$sSQL[] = "SELECT DISTINCT `name` FROM `names`";
$sSQL[] = "SELECT DISTINCT CONCAT(`firstname`, ' ', `lastname`) FROM `extended_names`";

$aNames = array
for ($i = 0, $x = count($sSQL); $i < $x; $i++) {
$rRes = mysql_query($sSQL);
^^



keine Ahnung wo die eckigen Klammern fuer den BBCode bei einer US-Tastatur sind, ein paar Zeichen kann ich nur, weil die Half-Life Console auch immer englische Tasten eingestellt hatte..
Zergling-new ist offline   Mit Zitat antworten
Alt 06.12.2006, 17:08  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Aha, Firefox Neustart hat geholfen:

PHP-Code:
<?php
$sSQL 
= array();
$sSQL[] = "SELECT DISTINCT `name` FROM `names`";
$sSQL[] = "SELECT DISTINCT CONCAT(`firstname`, ' ', `lastname`) FROM `extended_names`";

$aNames = array();
for (
$i 0$x count($sSQL); $i $x$i++) {
  
$rRes mysql_query($sSQL);
  while (
$aName mysql_fetch_assoc($rRes)) {
    
$sName $aName['name'];
    @
$aNames[$sName]++;
  }
}
foreach (
$aNames as $sName => $iName) {
  
printf("%s: %u\n
\n"
$sName$iName);
}
?>
Denke das ist performant genug.
Zergling-new ist offline   Mit Zitat antworten
Alt 07.12.2006, 08:59  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard

Dein Weg zeigt noch nicht ganz die richtige Lösung an. Das Distinct filter aus der Datenbank jeweils nur einen Satz raus.

Folgt habe ich den Code jetzt umgestellt und es geht:

Code:
$sSQL = array();
$sSQL[] = "SELECT `name`, COUNT(`name`) AS anzahl FROM `Name` GROUP BY `name`";
$sSQL[] = "SELECT `zweitname` AS name, COUNT(`zweitname`) AS anzahl FROM `zweitername` GROUP BY `zweitname`";

$aNames = array();
for ($i = 0, $x = count($sSQL); $i < $x; $i++)
  {
  $rRes = mysql_query($sSQL);
  while ($aName = mysql_fetch_assoc($rRes))
    {
    $sName = $aName['name'];
    if (!isset($aNames[$sName])) $aNames[$sNames]=0;
    $aNames[$sName]+=$aName['anzahl'];
    }
  }
foreach ($aNames as $sName => $iName)
  {
  printf("%s: %u\n
\n", $sName, $iName);
  }
Derzeit habe ich ca. 3600 verschiedene Namen in der Datenbank stehen. Die Abfrage geht sehr schnell und der Speicher kommt auch noch nicht in gefährliche regionen. Ich sehe das Problem somit als gelöst an, weil ich nicht glaube, das noch sehr viel mehr Namen hinzukommen.

Danke.
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline   Mit Zitat antworten
Alt 07.12.2006, 11:21  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Zitat von stefanjann
Dein Weg zeigt noch nicht ganz die richtige Lösung an. Das Distinct filter aus der Datenbank jeweils nur einen Satz raus.
Ha stimmt, schön dass du mitdenkst
Zergling-new ist offline   Mit Zitat antworten
Alt 12.12.2006, 11:28  
Erfahrener Benutzer
 
Registriert seit: 29.08.2003
Beiträge: 216
wurtzel
Standard

Code:
select count(Name) , Name from (
(
SELECT d.name AS Name
  FROM name n)
UNION ALL
(SELECT z.zweitname AS Name
  FROM zweitername z)

 ) a
GROUP BY Name 
ORDER BY Name ASC
__________________
Das Problem ist der Anfang einer Lösung
wurtzel ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Abfrage mit count, order by, group by...und Probleme BartTheDevil89 Datenbanken 2 15.06.2008 13:34
Min - Max auch ohne GROUP BY tekknotrip Datenbanken 6 17.04.2007 11:06
GROUP BY-Problem iRadiaX Datenbanken 6 20.05.2006 12:40
[Erledigt] ORDER BY + GROUP in einer Abfrage Datenbanken 5 23.02.2006 17:54
Union und ORDER BY wizzardxx PHP Tipps 2006 2 03.01.2006 17:57
Datensätze zählen mit 'group by' Unbekanntes_Pferd Datenbanken 4 15.11.2005 22:43
UNION in einem Subquery Datenbanken 0 26.10.2005 13:24
group by Rio99 Datenbanken 3 08.08.2005 19:45
Anhand Union Spalte aus anderen Tabellen selekt. und sort. Datenbanken 1 02.08.2005 11:34
Problem mit GROUP BY Klausel... (min, max...) 18inch Datenbanken 11 10.06.2005 18:21
[Erledigt] GROUP BY und COUNT in Spalten Datenbanken 3 15.05.2005 08:13
[Erledigt] probleme beim MIN() (Group BY) 18inch Datenbanken 2 31.12.2004 11:54
GROUP BY ? bicpi Datenbanken 16 13.09.2004 23:10
mehrere COUNT() mit verschiedenen GROUP BY -- geht das? tapferesschneiderlein Datenbanken 0 08.09.2004 14:54
probleme mit GROUP Datenbanken 3 28.07.2004 09:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql union group by, union group by, sql union group by, mysql union group, group by union, php union, mysql group by union, union group by mysql, union group, mysql group union, group by union mysql, union mit group by, mssql union group by, mysql union \group by\, sql union group, mysql union and group by, group by in union, group by union all, group union, php union select group by

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:36 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.