php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 15-11-2006, 18:10
TimeRaider
 Newbie
Links : Onlinestatus : TimeRaider ist offline
Registriert seit: Aug 2005
Beiträge: 54
TimeRaider ist zur Zeit noch ein unbeschriebenes Blatt
Standard group by und min

Hi,
ich habe in einer tabelle mehrere zeilen mit der gleichen user_id. jetzt möchte ich von denen die zeile mit dem kleinsten pos wert.

also z.b hab ich vier zeilen bei denen user_id gleich ist. bei einer zeile is pos 9 bei den anderen drei ist pos 11. jetzt möchte ich die zeile mit pos 9.

probiert hab ich schon
PHP-Code:
SELECT *,min(posFROM pics GROUP BY user_id HAVING min(pos
liefert, aber nicht das gewünsche ergebnis

gruss
jakob
Mit Zitat antworten
  #2 (permalink)  
Alt 15-11-2006, 18:59
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: group by und min

Geht nicht ... zumindest nicht in einem Query. Du kannst vor einem Group By nicht sortieren, leider >.>
Ersatz-Query will mir gerade nicht einfallen, mein Hirn ist gerade Matsche
Mit Zitat antworten
  #3 (permalink)  
Alt 15-11-2006, 19:26
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

So, nu ist endgültig fratze x_X
Code:
SELECT a.*
FROM `pics` a
WHERE a.id IN (
   SELECT b.id FROM pics b
   WHERE b.user_id = a.user_id
   ORDER BY pos ASC
)
GROUP BY a.user_id
[edit]
Full-Select .. hübsch Oo,

Geändert von ghostgambler (15-11-2006 um 19:30 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 15-11-2006, 19:41
TimeRaider
 Newbie
Links : Onlinestatus : TimeRaider ist offline
Registriert seit: Aug 2005
Beiträge: 54
TimeRaider ist zur Zeit noch ein unbeschriebenes Blatt
Standard

öhm gleiches ergebnis wie bei SELECT * FROM pics GROUP BY user_id

[edit]

mit
PHP-Code:
SELECT a . *
FROM `picsa
WHERE pos
IN 
(

SELECT minpos )
FROM pics b
GROUP BY b
.user_id
)
GROUP BY a.user_id 
bekomm ich zumindest schonmal das richtige ergebnis. der wert von pos ist einmalig hätte ich vielleicht noch sagen sollen. aber der query ist bestimmt ziemlich performance lastig, oder? geht das nicht irgendwie schneller?

Geändert von TimeRaider (15-11-2006 um 19:47 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 15-11-2006, 19:45
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von TimeRaider
öhm gleiches ergebnis wie bei SELECT * FROM pics GROUP BY user_id
Gibt bei mir das richtige Ergebnis

Test-Dump(Struktur+Daten) mit gewünschtem Ergebnis-Tuple, danke
Mit Zitat antworten
  #6 (permalink)  
Alt 15-11-2006, 19:47
TimeRaider
 Newbie
Links : Onlinestatus : TimeRaider ist offline
Registriert seit: Aug 2005
Beiträge: 54
TimeRaider ist zur Zeit noch ein unbeschriebenes Blatt
Standard

bei mir nicht hab gerade den oberen beitrag editiert
Mit Zitat antworten
  #7 (permalink)  
Alt 15-11-2006, 19:58
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ja, bei mir waren die Daten sortiert, deshalb gab es zufällig das korrekte Result-Tuple ~.~

Zitat:
Original geschrieben von TimeRaider
aber der query ist bestimmt ziemlich performance lastig, oder? geht das nicht irgendwie schneller?
Hätte spontan nen ganz dummen Einfall, eine zusätzliche Spalte, die angibt ob die aktuelle Zeile die mit dem kleinsten Wert ist

könnte man ev. mit dem Trigger aktuell halten, wenn du keine Lust hast das von Hand zu machen
Code:
DELIMITER |
CREATE TRIGGER pic_min_insert AFTER INSERT ON pics
FOR EACH ROW BEGIN
   UPDATE pics SET minimal = 0 WHERE user_id = NEW.user_id;
   UPDATE pics SET minimal = 1 WHERE user_id = NEW.user_id ORDER BY pos ASC LIMIT 1;
END|
DELIMITER ;
weil performant ist der Query mit Sicherheit nicht, da dürfte die Lösung über den Trigger besser sein .. geht allerdings erst ab mysql5

Und dann würde ein Query allá
SELECT * FROM pics WHERE minimal = 1;
das gewünschte Ergebnis bringen
Mit Zitat antworten
  #8 (permalink)  
Alt 15-11-2006, 20:02
TimeRaider
 Newbie
Links : Onlinestatus : TimeRaider ist offline
Registriert seit: Aug 2005
Beiträge: 54
TimeRaider ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hey,

ok danke.

muss ich den trigger dann einfach am anfang vom script mit mysql_query ausführen?

gruss
jakob
Mit Zitat antworten
  #9 (permalink)  
Alt 15-11-2006, 20:06
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von TimeRaider
muss ich den trigger dann einfach am anfang vom script mit mysql_query ausführen?
Ne, der ist für immer in der DB ... man lese das Manual bezüglich Triggern
Mit Zitat antworten
  #10 (permalink)  
Alt 15-11-2006, 21:13
TimeRaider
 Newbie
Links : Onlinestatus : TimeRaider ist offline
Registriert seit: Aug 2005
Beiträge: 54
TimeRaider ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hm ich glaub mit triggern funktioniert das nicht.

ich erklär einfach mal was ich genau mach:
es gibt noch zwei andere spalten "in" und "out" aus denen wird dann einmal am tag ein prozentwert gebildet und die zeile in der dieser am größten ist bekommt pos 1, die mit dem zweit größten prozentwert 2 und immer so weiter. kann ich da gleich das minimal mit einbaun oder wie mach ich das am besten?
Mit Zitat antworten
  #11 (permalink)  
Alt 15-11-2006, 21:19
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von TimeRaider
hm ich glaub mit triggern funktioniert das nicht.

ich erklär einfach mal was ich genau mach:
es gibt noch zwei andere spalten "in" und "out" aus denen wird dann einmal am tag ein prozentwert gebildet und die zeile in der dieser am größten ist bekommt pos 1, die mit dem zweit größten prozentwert 2 und immer so weiter. kann ich da gleich das minimal mit einbaun oder wie mach ich das am besten?
WIESO machst du eigentlich nicht einfach ein
WHERE pos = 1 ?????????? -.-
Mit Zitat antworten
  #12 (permalink)  
Alt 15-11-2006, 21:31
TimeRaider
 Newbie
Links : Onlinestatus : TimeRaider ist offline
Registriert seit: Aug 2005
Beiträge: 54
TimeRaider ist zur Zeit noch ein unbeschriebenes Blatt
Standard

weil es verschiedene user_id gibt und die dann in einer liste ausgegeben werden, aber natürlich nur die mit dem kleinsten pos wert?
PHP-Code:
mysqlSELECT id,user_id,pos FROM pics ORDER by user_id;
+----+---------+-----+
id user_id pos |
+----+---------+-----+
27 |       |   |
32 |       |  12 |
24 |       |   |
25 |       |  10 |
31 |       |   |
19 |       |   |
17 |       |  11 |
|  
|       |   |
21 |       |   |
33 |       |  13 |
10 |       |   |
22 |      10 |   |
23 |      10 |   |
+----+---------+-----+ 
und von der tabelle will ich jetzt die zeilen mit der id 31,19,10,22 was ja auch mit
PHP-Code:
    SELECT a . *
    
FROM `picsa
    WHERE pos
    IN 
(

    
SELECT minpos )
    
FROM pics b
    GROUP BY b
.user_id
    
)
    
GROUP BY a.user_id 
ganz gut funktioniert und jetzt möchte ich halt nur noch wie du vorgeschlagen hast eine spalte minimal und weiß nicht wie ich das am besten machen, weil das sollte ja von der geschwindigkeit her auch passen.
Mit Zitat antworten
  #13 (permalink)  
Alt 15-11-2006, 21:44
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Achso ... user-übergreifende pos ~.~

Wie sieht denn das Skript aus, welches die pos-Spalte berechnet?
Mit Zitat antworten
  #14 (permalink)  
Alt 15-11-2006, 22:05
TimeRaider
 Newbie
Links : Onlinestatus : TimeRaider ist offline
Registriert seit: Aug 2005
Beiträge: 54
TimeRaider ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ist eigentlich ziemlich einfach
PHP-Code:
    $result $sql->query("SELECT id,`in`,out,((`in`/(`in`+out))*100) as prozent FROM pics ORDER by prozent DESC");
    
    
$i 1;
    
    while (
$row $sql->fetch_assoc($result)) {
        
$sql->query("UPDATE pics SET pos=".$i." WHERE id=".$row['id']);
        
$i++;
    } 
Mit Zitat antworten
  #15 (permalink)  
Alt 16-11-2006, 07:32
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Okay, also ... du kannst eine User-Variable in MySQL verwenden, welche dir in deinem Ergebnis automatisch die pos Zählt

Code:
SET @pos = 0;
UPDATE pics SET pos = @pos = @pos+1 ORDER BY (in/(in+out));
Das sollte genau das machen wie dein Query oben (ich hoffe die Syntax ist jetzt richtig oO), nur halt in einem Query und ohne While ... vllt. kann man da mit einer weiteren Var und einem IF direkt im Query die min-Spalte setzen, hab aber keine Zeit mehr das jetzt auszuprobieren (weil Schule ^^)

Kannst ja mal selbst rumprobieren *wink*
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 02:19 Uhr.