php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.06.2011, 15:52  
Neuer Benutzer
 
Registriert seit: 06.05.2010
Beiträge: 28
PHP-Kenntnisse:
Anfänger
bulb befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Zwei SELECT Anweisungen verknüpfen

Hallo,

ich bin gerade dabei die Anzahl meiner SQL-Abfragen zu vergeringern. Dies Klappt alles soweit ganz gut. Jedoch verzweifele ich an folgendem Code/SQL.

PHP-Code:
  $c1 0;
  
$c2 0;

  
$sql "SELECT * FROM folders";
  
$result mysql_query($sql,$db);
    while (
$stat mysql_fetch_array($resultMYSQL_ASSOC))
    {
        
$c1++;
        
$isql "SELECT COUNT(*) FROM files, folders WHERE files.folder = $stat[id] OR folders.parent = $stat[id]";
        
$iresult mysql_query($isql,$db);
        
$istat mysql_fetch_array($iresultMYSQL_ASSOC);
        if ( (
$istat["COUNT(*)"] == 0) ) {
            
$c2++;
        }
    }
    
$tpl -> assign('ST_FOLDER',$c1);
    
$tpl -> assign('ST_EFOLDER',$c2); 
Wenn ich in der ersten SQL-Abfrage($sql) 5.000 oder 6.000 Ergebnisse bekomme, dann durchläuft er die While-Schliefe dementsprechend oft durch. Jetzt war meine Idee die beiden SQL zusammen zu legen.
Egentlich sollte dies ja mit Join funktionieren. Meine Ansätze sind wie folgt

PHP-Code:
select from folders a left join files b on b.folder a.parent 
WHERE b
.folder a.id OR b.foldera.id 
Jedoch bekomme ich leider kein übereinstimmendes Ergebnis. Hat jemand einen Ansatz für mich, wie ich die Anzahl der SQL verringern kann?


Die Tabellen sind wie folgt aufgebaut:

files
id|name|folder

folder
id|name|parent

Geändert von bulb (10.06.2011 um 16:09 Uhr).
bulb ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 10.06.2011, 16:00  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

$c1 ist ja letztlich nur: SELECT COUNT(*) FROM folders;

$c2 zählt alle Dateien und - unverständlicherweise - nochmal alle Unterordner. Dann mach doch einfach
$c2 = SELECT COUNT(*) FROM files + ($c1 - Anzahl Rootordner)

Oder was willst du mit deinem Skript erreichen?
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 10.06.2011, 16:03  
Neuer Benutzer
 
Registriert seit: 06.05.2010
Beiträge: 28
PHP-Kenntnisse:
Anfänger
bulb befindet sich auf einem aufstrebenden Ast
Standard

$c2 gibt an, wieviele Ordner leer sind. Das heißt, es sind keine unterordner vorhanden und es sind keine Files vorhanden.

"Anzahl Rootordner" ist mir somit unbekannt
bulb ist offline   Mit Zitat antworten
Alt 10.06.2011, 16:13  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Dann sag das doch gleich.

$c2:
Code:
-- empty folders:
SELECT COUNT(*)
FROM folders
WHERE
  id NOT IN (
    SELECT DISTINCT parent FROM folders
  )
  AND 
  id NOT IN (
    SELECT DISTINCT folder FROM files
  )
Wenn auf folders.id, folders.parent und files.folder ein Index liegt, sollte es recht fix gehen.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 10.06.2011, 16:16  
Neuer Benutzer
 
Registriert seit: 06.05.2010
Beiträge: 28
PHP-Kenntnisse:
Anfänger
bulb befindet sich auf einem aufstrebenden Ast
Standard

Du bist jetzt mein persönlicher SQL-Gott.

Nach Versuch Nummer 1 funktioniert es. Jetzt noch verstehen und dann im Live System testen.

DANKE
bulb ist offline   Mit Zitat antworten
Alt 10.06.2011, 16:21  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

SELECT DISTINCT parent FROM folders:
liefert dir alle Ordner, die Unterordner haben. Mit der NOT IN Anweisung schließt du diese also aus. Es bleiben leere Ordner und solche Ordner, die nur Dateien beinhalten, weswegen wir noch die zweite Bedingung dazunehmen:

SELECT DISTINCT folder FROM files
alle folder zurückliefern, die Dateien beinhalten. Durch NOT IN drehen wir die Bedeutung wieder um; zusammen mit der vorherigen bekommst du also als Ergebnis alle komplett leeren Ordner.

DISTINCT entfernt doppelte Einträge, die blähen die NOT IN-Abfrage nur unnötig auf.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 10.06.2011, 16:30  
Neuer Benutzer
 
Registriert seit: 06.05.2010
Beiträge: 28
PHP-Kenntnisse:
Anfänger
bulb befindet sich auf einem aufstrebenden Ast
Standard

Cool, ich glaub ich habs verstanden.

Gruß Bulb
bulb ist offline   Mit Zitat antworten
Alt 10.06.2011, 16:53  
Neuer Benutzer
 
Registriert seit: 06.05.2010
Beiträge: 28
PHP-Kenntnisse:
Anfänger
bulb befindet sich auf einem aufstrebenden Ast
Standard

Ich muss Dich noch mal belästigen. Wenn ich die Anweisung im Livesystem teste, dann fällt die Querry unter die slow querries:

# Query_time: 140 Lock_time: 0 Rows_sent: 1 Rows_examined: 21746856

In den Tabellen habe ich folgende Anzahl an Datensätze:
Files:17,452
Folders: 2,356

Jetzt finde ich 140Sekunden trotzdem recht viel. Kann ich hier irgendwie nochw was machen?
bulb ist offline   Mit Zitat antworten
Alt 10.06.2011, 17:02  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
-- empty folders:
SELECT COUNT(*)
FROM folders
WHERE
id NOT IN (
SELECT DISTINCT parent FROM folders
)
AND
id NOT IN (
SELECT DISTINCT folder FROM files
)
Wärs nicht einfacher, auf beide nen JOIN zu legen und NULL anzufragen?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 10.06.2011, 17:19  
Neuer Benutzer
 
Registriert seit: 06.05.2010
Beiträge: 28
PHP-Kenntnisse:
Anfänger
bulb befindet sich auf einem aufstrebenden Ast
Standard

Da weiß ich gerade nicht so recht, was du damit meinst?

Meinst du sowas in der Art?
PHP-Code:
SELECT *
FROM folders a
JOIN files b ON b
.folder a.parent
WHERE 
`description` = NULL 
bulb 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
[Erledigt] COUNT und MAX in 1 SELECT coola Datenbanken 2 07.12.2010 22:12
[Erledigt] Intertabellarische Berechnungen, wie? dave303 Datenbanken 13 05.03.2010 11:58
Tabelle aus CSV erstellen und Inhalte verknüpfen tekknokrat Datenbanken 2 25.02.2010 20:52
Ausgabe erfolgt nicht Extremefall PHP Tipps 2009 17 17.12.2009 19:51
[Erledigt] Einen SELECT von zusammengeführten Tabellen erstellen knuffiwuffi PHP Tipps 2009 23 08.12.2009 12:58
Select WHERE Select J_Jara Datenbanken 4 01.12.2009 20:08
[Erledigt] INSERT ... SELECT - nicht alle Spalten aus dem Select benutzen? kip Datenbanken 4 01.09.2009 13:06
[Erledigt] Select * where in (Select ...) Geschwindigkeitsproblem Wolla Datenbanken 14 20.05.2009 15:16
SQL select fehlerhafte Resultate. Ist PHP 64 Bit das Problem? peterw Server, Hosting und Workstations 6 21.04.2009 09:19
[Erledigt] Kein Ergebnis bei SELECT (MySQL 4.1.9) dr.e. Datenbanken 4 15.06.2008 19:54
[JavaScript] Event Handler in form select - Syntax? winfo_cologne HTML, Usability und Barrierefreiheit 5 29.03.2006 16:47
[Erledigt] Update mit Select Anweisung verknüpfen Datenbanken 3 12.09.2005 16:37
mehrere tabellen verknüpfen bei select Datenbanken 3 29.09.2004 11:00
select query durch if anweisungen splitten Datenbanken 6 06.09.2004 13:46
[Erledigt] 2 mal select 1 form PHP-Fortgeschrittene 1 01.09.2004 20:13

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
select verknüpfen, mehrere select anweisungen, sql 2 selects verbinden, mehrer select anweisungen in einer query, psql 2 select abfragen verknüpfen, sql zwei selects verbinden, select distinct zwei, select-anweisungen verbinden, 2 select verknüpfen, sql select verketten, sql ergebnisse mehrere select verbinden, sql anweisungen verknüpfen, select anweisungen verknüpfen, zwei select verbinden, sql mehrere select abfragen verbinden, sql 2 select verbinden, zwei where anweisungen in einem select sql, zwei select kombinieren, isql count, sql 2 select verknüpfen

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:04 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