Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Web Development
You last visited: Today at 12:30

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



/ [SQL] Vergleichen von Daten

Discussion on / [SQL] Vergleichen von Daten within the Web Development forum part of the Coders Den category.

Reply
 
Old   #1
 
Legithos's Avatar
 
elite*gold: 95
Join Date: Nov 2009
Posts: 669
Received Thanks: 47
/ [SQL] Vergleichen von Daten

Hallo zusammen,

ich bin mir nicht sicher, welchen SQL-Query für folgende Situation am Besten nutzen kann.

Ich habe eine Tabelle, welche die IP-Adressen aller User mit Zeitstempel speichert, wenn diese sich einloggen. Ich würde jetzt gerne im Hinblick auf Multiaccounts überprüfen, ob sich denn verschiedene User mit der gleichen IP (optional: in einer bestimmten Zeit) eingeloggt haben.

Code:
Tablename - users_ip

+-------+------------+----------+
|user_id|     ip     |   date   |
+-------+------------+----------+
|   1   |  127.0.0.1 |23.02.2020|
+-------+------------+----------+
|   1   |  194.3.2.6 |24.02.2020|
+-------+------------+----------+
|   2   |  127.5.5.5 |25.02.2020|
+-------+------------+----------+
|   1   |  127.0.0.1 |26.02.2020|
+-------+------------+----------+
|   4   |  194.3.2.6 |27.02.2020|
+-------+------------+----------+
|   3   |  127.5.5.5 |28.02.2020|
+-------+------------+----------+
|   5   |  127.5.5.5 |29.02.2020|
+-------+------------+----------+
Nun hätte ich gerne folgendes Ergebnis aus der Tabelle ausgelesen:

User 1 und 4 hatten die gleiche IP (optional User 1 am 24.02.2020, User 4 am 27.02.2020)
User 2, 3 und 5 hatten die gleiche IP (optional User 2 am 25.02.2020, User 3 am 28.02.2020 und User 5 am 29.02.2020).

Wäre super froh, wenn mir jemand helfen kann !
Legithos is offline  
Old 02/26/2020, 18:36   #2
 
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,465
Code:
SELECT ip, GROUP_CONCAT ( DISTINCT user_id ) AS user_ids
FROM log
GROUP BY ip
Das wäre "Zeige alle User die diese IP jemals hatten".
florian0 is offline  
Old 02/26/2020, 19:14   #3
 
Legithos's Avatar
 
elite*gold: 95
Join Date: Nov 2009
Posts: 669
Received Thanks: 47
Quote:
Originally Posted by florian0 View Post
Code:
SELECT ip, GROUP_CONCAT ( DISTINCT user_id ) AS user_ids
FROM log
GROUP BY ip
Das wäre "Zeige alle User die diese IP jemals hatten".
Was meinst du denn mit "diese IP jemals hatten" ? Welche IP ?
Legithos is offline  
Old 02/26/2020, 19:25   #4
 
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,465
Die ausgegebene IP. Das GROUP BY ip gruppiert alle Einträge nach IP. d.H. jede IP kommt in der Ausgabe nur ein Mal vor. Das DISTINCT sorgt dafür, dass jede Id nur ein Mal vorkommt. Das macht die Ausgabe übersichtlicher.

Code:
+--------+------------+
|user_ids|     ip     |
+--------+------------+
|   1    |  127.0.0.1 |
+--------+------------+
|  1, 4  |  194.3.2.6 |
+--------+------------+
| 2, 3, 5|  127.5.5.5 |
+--------+------------+
Wenn du magst, kannst du den Query natürlich noch mit WHERE eingrenzen.
florian0 is offline  
Old 02/26/2020, 21:40   #5
 
Legithos's Avatar
 
elite*gold: 95
Join Date: Nov 2009
Posts: 669
Received Thanks: 47
Habs verstanden danke - klappt auch! Kann ich denn mit einer WHERE-Bedingung noch dranpacken, dass ich nur Einträge will bei denen die IP mehrmals von unterschiedlichen user_ids verwendet wird ?

Gerade bekomme ich alle IPs, also auch die, welche nur von einem user verwendet werden.

EDIT:

Habs mit HAVING COUNT(user_id)>1 hinbekommen!
Legithos is offline  
Old 02/26/2020, 21:47   #6


 
False's Avatar
 
elite*gold: 0
The Black Market: 243/0/0
Join Date: Apr 2011
Posts: 11,118
Received Thanks: 2,435
Quote:
Originally Posted by Legithos View Post
Habs verstanden danke - klappt auch! Kann ich denn mit einer WHERE-Bedingung noch dranpacken, dass ich nur Einträge will bei denen die IP mehrmals von unterschiedlichen user_ids verwendet wird ?

Gerade bekomme ich alle IPs, also auch die, welche nur von einem user verwendet werden.
Um das Ergebnis von group by einzuschränken nutzt man having:

Aber um deine Frage zu beantworten, ja es ist möglich :-)
False is offline  
Thanks
1 User
Old 02/27/2020, 01:25   #7
dotCom
 
Devsome's Avatar
 
elite*gold: 12400
The Black Market: 104/0/0
Join Date: Mar 2009
Posts: 15,882
Received Thanks: 4,386
Und immer hier drauf achten:
Devsome is offline  
Thanks
1 User
Old 02/27/2020, 07:47   #8
 
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,465
Quote:
Originally Posted by Legithos View Post
Habs verstanden danke - klappt auch!
Man muss sich halt überlegen ob das GROUP BY , bzw gerade das GROUP_CONCAT für eine Weiterverarbeitung Sinn macht. Du bekommst als Ausgabe eine Auflistung die du in z. B. PHP erstmal wieder zerlegen musst.
Ggf. macht es Sinn nur die Anzahl durch GROUP BY zu berechnen und dann durch Folgequeries Details zu den einzelnen IPs zusammenzustellen.
florian0 is offline  
Old 02/27/2020, 17:28   #9
 
Legithos's Avatar
 
elite*gold: 95
Join Date: Nov 2009
Posts: 669
Received Thanks: 47
Quote:
Originally Posted by florian0 View Post
Man muss sich halt überlegen ob das GROUP BY , bzw gerade das GROUP_CONCAT für eine Weiterverarbeitung Sinn macht. Du bekommst als Ausgabe eine Auflistung die du in z. B. PHP erstmal wieder zerlegen musst.
Ggf. macht es Sinn nur die Anzahl durch GROUP BY zu berechnen und dann durch Folgequeries Details zu den einzelnen IPs zusammenzustellen.
Da bin ich sogar schon dran .

EDIT:

Wobei ich noch ein weiteres Problem hab .. Also aktuell sieht mein Query so aus

Code:
$sql = "SELECT ip, GROUP_CONCAT( DISTINCT ip_user_id) AS ip_user_id
FROM users_ip
WHERE ip_hint='0' GROUP BY ip
HAVING COUNT(DISTINCT ip_user_id)>1";
Ich bekomme zwar ein nettes Ergebnis, nur zeigt er mir nun etwas zu viel an.

Code:
+--------+------------+
|user_ids|     ip     |
+--------+------------+
|   1    |  127.0.0.1 |
+--------+------------+
| 1, 4, 1|  194.3.2.6 |
+--------+------------+
| 2, 3, 5|  127.5.5.5 |
+--------+------------+
Ich bekomme zB. bei der IP 194.3.2.6 die user_id 1 insgesamt 2x angezeigt. Was ich will ist ja nur zu wissen, ob sich zwei unterschiedliche IDs mit der gleichen IP einloggen. Wenn mir nun aber alle IDs zu einer IP x-fach angezeigt werden, wird das ziemlich viel pro IP

Ich habe folgende Datenbank:

Tabellenname - users_ip
- ip_id (die AI ID des Eintrages in die users_ip Tabelle)
- ip_user_id (fuer die userid der jeweiligen IP)
- ip (die eigentliche IP)
- ip_hint (wenn dieser 0 ist, soll es mir angezeigt werden)
Legithos is offline  
Old 02/28/2020, 18:30   #10
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,876
Quote:
Originally Posted by Legithos View Post
Da bin ich sogar schon dran .

EDIT:

Wobei ich noch ein weiteres Problem hab .. Also aktuell sieht mein Query so aus

Code:
$sql = "SELECT ip, GROUP_CONCAT( DISTINCT ip_user_id) AS ip_user_id
FROM users_ip
WHERE ip_hint='0' GROUP BY ip
HAVING COUNT(DISTINCT ip_user_id)>1";
Ich bekomme zwar ein nettes Ergebnis, nur zeigt er mir nun etwas zu viel an.

Code:
+--------+------------+
|user_ids|     ip     |
+--------+------------+
|   1    |  127.0.0.1 |
+--------+------------+
| 1, 4, 1|  194.3.2.6 |
+--------+------------+
| 2, 3, 5|  127.5.5.5 |
+--------+------------+
Ich bekomme zB. bei der IP 194.3.2.6 die user_id 1 insgesamt 2x angezeigt. Was ich will ist ja nur zu wissen, ob sich zwei unterschiedliche IDs mit der gleichen IP einloggen. Wenn mir nun aber alle IDs zu einer IP x-fach angezeigt werden, wird das ziemlich viel pro IP

Ich habe folgende Datenbank:

Tabellenname - users_ip
- ip_id (die AI ID des Eintrages in die users_ip Tabelle)
- ip_user_id (fuer die userid der jeweiligen IP)
- ip (die eigentliche IP)
- ip_hint (wenn dieser 0 ist, soll es mir angezeigt werden)
Gibt sicher schönere und performantere Möglichkeiten, aber eine relativ intuitive Lösung, wäre es einfach in einer Subquery alle doppelten Einträge rauszufiltern:

Code:
$sql = "SELECT ip, GROUP_CONCAT( DISTINCT ip_user_id) AS ip_user_id
FROM (SELECT DISTINCT ip_user_id,ip  FROM users_ip WHERE ip_hint='0') 
GROUP BY ip
HAVING COUNT(DISTINCT ip_user_id)>1";
(ungetestet, sollte aber funzen)
Shadow992 is offline  
Thanks
1 User
Old 02/28/2020, 19:44   #11


 
False's Avatar
 
elite*gold: 0
The Black Market: 243/0/0
Join Date: Apr 2011
Posts: 11,118
Received Thanks: 2,435
Quote:
Originally Posted by Legithos View Post
Da bin ich sogar schon dran .

EDIT:

Wobei ich noch ein weiteres Problem hab .. Also aktuell sieht mein Query so aus

Code:
$sql = "SELECT ip, GROUP_CONCAT( DISTINCT ip_user_id) AS ip_user_id
FROM users_ip
WHERE ip_hint='0' GROUP BY ip
HAVING COUNT(DISTINCT ip_user_id)>1";
Ich bekomme zwar ein nettes Ergebnis, nur zeigt er mir nun etwas zu viel an.

Code:
+--------+------------+
|user_ids|     ip     |
+--------+------------+
|   1    |  127.0.0.1 |
+--------+------------+
| 1, 4, 1|  194.3.2.6 |
+--------+------------+
| 2, 3, 5|  127.5.5.5 |
+--------+------------+
Ich bekomme zB. bei der IP 194.3.2.6 die user_id 1 insgesamt 2x angezeigt. Was ich will ist ja nur zu wissen, ob sich zwei unterschiedliche IDs mit der gleichen IP einloggen. Wenn mir nun aber alle IDs zu einer IP x-fach angezeigt werden, wird das ziemlich viel pro IP

Ich habe folgende Datenbank:

Tabellenname - users_ip
- ip_id (die AI ID des Eintrages in die users_ip Tabelle)
- ip_user_id (fuer die userid der jeweiligen IP)
- ip (die eigentliche IP)
- ip_hint (wenn dieser 0 ist, soll es mir angezeigt werden)
Irgendwas stimmt bei deinem Beitrag nicht, entweder deine Query oder dein Ergebniss.
Das Distinct im select part sollte schon dafür sorgen das keine Doppelten user ids angezeigt werden.
Du hast sogar ein distinct im having part, was dafür sorgt das keine Einträge angezeigt werden wo die Ips mehrmals geloggt wurde aber immer vom selben User.

Daher sollte deine Query so schon funktionieren.
Beispiel:
False is offline  
Thanks
1 User
Old 02/28/2020, 23:17   #12
 
Legithos's Avatar
 
elite*gold: 95
Join Date: Nov 2009
Posts: 669
Received Thanks: 47
Ich hab den Fehler gefunden, habs mir mit der zweiten verschachtelten Query selbst verbockt !

Wirklich vielen lieben Dank euch !
Legithos is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
C# Daten und größe Vergleichen und ggf. Updaten
10/11/2012 - .NET Languages - 5 Replies
Hey, ich bin neu in C# und wollte man fragen, wie man ambesten Daten, die auf dem server liegen mit welchen, die auf dem pc liegen vergleichen kann und ggf. aktualiesieren kann, praktisch wie ein patcher. mfg xNoThx
[SQL]2 Spalten vergleichen
05/28/2012 - General Coding - 2 Replies
Guten Morgen, ich habe in einer Tabelle 2 Spalten time verfall nun möchte ich mir alle Einträge suchen, bei denen die Spalte "time" >= die Spalte "verfall" ist.
Kann ein Mod die IPs von zwei Usern vergleichen?
05/24/2012 - Main - 4 Replies
Hallo Kann ein Mod drei IPs vergleichen? Wurde mehrmals von einigen Usern angeschrieben die sich ähneln. Brauche nicht die IPs, nur eine Bestätigung. Danke
[PHP] Mysql daten vergleichen
10/14/2011 - Web Development - 11 Replies
Moin, ich möchte einen Wert (text) mit einen anderen wert Vergleichen (der im Script ist) jedoch kommt nur der fehler, das Ich nicht berechtigt bin (sog) Code: $verbindung = mysql_connect("localhost", "web" , "pw") or die("Verbindung zur Datenbank konnte nicht hergestellt werden"); mysql_select_db("wdata") or die ("Datenbank konnte nicht ausgewählt werden"); $abfrage = "SELECT IGactiv FROM login WHERE username LIKE '$name' LIMIT 1"; $ergebnis = mysql_query($abfrage); $row =...
Welche Klassen kann man mit den Klassen von WoW vergleichen?
10/09/2011 - General Gaming Discussion - 30 Replies
Thema sagt eigentl. alles ;)



All times are GMT +2. The time now is 12:30.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.