Performant MySQL-TBL vergleichen

Tach Community,

ich habe einen LOG Auszug meiner Telefonanlage in meine
MySQL Datenbank gespielt. Nun moechte ich diverse Filter
setzen und Daten miteinander vergleichen

ich habe unter anderem folgende Struktur:

+--+---------+------------+-----+
|ID|Rufnummer|Sprechstelle|Dauer|
+---------+------------+-----+
|01|017322232|10 |04:30|
+---------+------------+-----+
|02|033443454|12 |04:30|
+---------+------------+-----+
|03|043234322|33 |04:30|
+---------+------------+-----+

wie vergleiche ich folgendes:

zeige alle Nummern an, die sowohl
von sprechstelle 10 und 33 angerufen wurden.

mir fehlt da der ansatz.
performant waere wohl , wenn ich das gleich in sql
machen koennte… nur… keine ahnung wie…

danke fuer die hilfe

grusz

PixelKoenig

Hallo,

ich habe unter anderem folgende Struktur:

±-±--------±-----------±----+
|ID|Rufnummer|Sprechstelle|Dauer|
±--------±-----------±----+
|01|017322232|10 |04:30|
±--------±-----------±----+
|02|033443454|12 |04:30|
±--------±-----------±----+
|03|043234322|33 |04:30|
±--------±-----------±----+

wie vergleiche ich folgendes:

zeige alle Nummern an, die sowohl
von sprechstelle 10 und 33 angerufen wurden.

Ich hatte gerade überlegt, ob es mit GROUP BY / HAVING geht, da fällt mir aber nichts zu ein, wie ich mehrfach von einem Anschluss angerufene filtere… ein JOIN geht auf jeden Fall, ist aber ggfs. langsamer:

select distinct a.rufnummer from tabelle a, tabelle b where a.rufnummer=b.rufnummer and a.sprechstelle=10 and b.sprechstelle=33

Tabelle ist beide Male die von oben…

Alexander

Hi Alexander,

select distinct a.rufnummer from tabelle a, tabelle b where
a.rufnummer=b.rufnummer and a.sprechstelle=10 and
b.sprechstelle=33

Tabelle ist beide Male die von oben…

ich bemerke anhand deines loesungsvroschlages gerade mein defizit an SQL.

-D

kennst du eine gute online referenz mit bezug auf PHP?
Am besten wo so kleine tips / schnippsel vorgestellt werden.
im falle sowieso… benutzt man am besten dieses oder jenes…

ne mysql referenz gibts ja online. dumm nur wenn man nicht weiss, nach was man suchen muss… bzw kann.

also… so ne tipdatenbank praktisch. kann auch ne buchempfehlung sein. moechte nur mysql nicht komplett lernen. muss es nur „mal eben schnell anwenden“ :wink: wissen wird dann nachgeschoben.

danke fuer den hinweis.

grusz

PixelKoenig

etwaige Lösung?->bitte mal verbessern
hi…
was ist mit „IN“ … kann man das nicht benutzen?

mysql\> SELECT \* FROM myTable WHERE Rufnummer IN ('Sprechstelle1', 'Sprechstelle2');

irgendwie so? funzt bei mir nur nich richtig… hmm…
ich weiss nur noch nicht wo der fehler liegt. aber ist das ein ansatz?
ist das so richtig`?

grusz

PixelKoenig

hi PixelKoenig,

hi…
was ist mit „IN“ … kann man das nicht benutzen?

mysql> SELECT * FROM myTable WHERE Rufnummer IN
(‚Sprechstelle1‘, ‚Sprechstelle2‘);

habe ich das richtig verstanden? du willst alle Nummern von Sprechstelle x, x elem. nat. zahl.
‚Sprechstelle1‘, ‚Sprechstelle2‘ sind aber strings, so kann das nat. nicht klappen.

$sprechstelle1[0]=19;
$sprechstelle1[1]=19;
mysql("Select \* from Telefon where Sprechstelle=$sprechstelle[0] OR Sprechstelle=$sprechstelle[1]");

wenn du bel. viele Sprechstellen checken moechtest musst du halt das array zu einem String Konkatenieren.
ich habe da ein Codefrahgment in php.net gefunden: da dann das Komma mit einem OR vertauschen und fertig:

adrian at foeder dot de
31-Oct-2005 07:53


    
    function implode\_with\_keys($glue, $array, $valwrap='')
     {
     foreach($array AS $key =\> $value) {
     $ret[] = $key."=".$valwrap.$value.$valwrap;
     }
     return implode($glue, $ret);
     }
    ?\>




hier der link:

[http://www.php.net/manual/de/function.implode.php](http://www.php.net/manual/de/function.implode.php)

hth josh


> irgendwie so? funzt bei mir nur nich richtig... hmm..  
> ich weiss nur noch nicht wo der fehler liegt. aber ist das ein  
> ansatz?  
> ist das so richtig`?  
>   
> grusz  
>   
> PixelKoenig

hi…
was ist mit „IN“ … kann man das nicht benutzen?

mysql> SELECT * FROM myTable WHERE Rufnummer IN
(‚Sprechstelle1‘, ‚Sprechstelle2‘);

irgendwie so? funzt bei mir nur nich richtig… hmm…

IN ist im Beispiel oben nur kurz für (Rufnummer=‚Sprechstelle1‘) OR (Rufnummer=‚Sprechstelle1‘), das wird so nix, das liefert alle Zeilen, bei denen Rufnummer gleich Sprechstelle1 oder Sprechstelle2 ist.

WHERE filtert grundsätzlich immer eine Zeile, d.h. entweder entspricht die der Bedingung ung wird angezeigt, oder nicht.

Du willst jetzt ja aber Angaben aus 2 Zeilen kombinieren, deswegen in meinem Posting oben das JOIN mit sich selbst, d.h. erstmal wird jeder Datensatz der ersten Tabelle mit jedem Datensatz der 2. Tabelle zu einer Riesentabelle mit Anzahl^2 Zeilen verbunden, und danach per WHERE die passenden Zeilen rausgefiltert (gleiche Nummer, verschiedene Sprechstellen; ganz so schlimm ist’s in Wirklichkeit nicht, mySQL wertet die Bedingung eher aus, daher gehts schneller). Kannst du ja einfach mal mit einer kleinen Tabelle ohne WHERE probieren, wie das geht…

Neben JOIN gibt es noch die Möglichkeit, nach verschiedenen Eigenschaften zu gruppieren und dann mit HAVING für diese Gruppen zusätzliche Bedinungen einzuführen, allerdings klappt das im angeführten Beispiel nicht. Möglich wäre damit zum Beispiel, die Anzahl der Anrufe pro Sprechstelle auszugeben:

SELECT Sprechstelle, count(Rufnummer) FROM tabelle GROUP BY Sprechstelle

oder auch nur die, wo mehr als 10 Anrufe waren:

SELECT Sprechstelle, count(Rufnummer) FROM tabelle GROUP BY Sprechstelle HAVING count(Rufnummer)>10

http://little-idiot.de/mysql/ (Kapitel 28) ist wahrscheinlich schon zu umfangreich für dich, aber lesenswert…

Alexander