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 30-08-2006, 20:46
atzemann
 Newbie
Links : Onlinestatus : atzemann ist offline
Registriert seit: Aug 2006
Beiträge: 4
atzemann ist zur Zeit noch ein unbeschriebenes Blatt
Question Join unter bestimmter bedingung ausführen?

Hallo,

ich habe ein kleines Problem, bei dem ich mal die Hilfe von Profis benötige. Möglicherweise ist, was ich vorhabe auch gar nicht möglich.

Ich stelle über ein PHP-Skript eine MySQL-Anfrage, in der ein INNER JOIN vorkommt.
Dieser INNER JOIN soll aber nur ausgeführt werden, wenn er auch möglich ist, d.h. wenn in der ON-Clause genannten Felder auch gefüllt sind.

Vielleicht erstmal den Code, dann ist einfacher ?!

PHP-Code:
SELECT a.aktionID,a.kundenID,a.max_klick,a.max_viewa.eigen
    FROM aktion a
    
    INNER JOIN kunden_konto k ON a
.kundenID=k.kundenID
      
AND (k.klick>='1' or a.eigen='1')
      AND (
k.view>='1' or a.eigen='1')

    
INNER JOIN stat_aktion sa ON a.aktionID=sa.aktionID
      
AND (sa.klick a.max_klick or a.max_klick='-1')
      AND (
sa.view a.max_view or a.max_view='-1')
      AND 
sa.date='2006-08-30'

    
AND a.aktiv='1'
    
ORDER BY rand()
    
LIMIT 0,
die Tabelle stat_aktion ist eine Statistik-Tabelle. Es kann vorkommen, daß für die Spalte sa.date am 2006-08-30 noch gar kein Eintrag vorgenommen, in diesem Falle wird bei dem jetzigen Skript kein Ergebnis ausgegeben.

Was möchte ich erreichen?
dieser Join
PHP-Code:
INNER JOIN stat_aktion sa ON a.aktionID=sa.aktionID
      
AND (sa.klick a.max_klick or a.max_klick='-1')
      AND (
sa.view a.max_view or a.max_view='-1')
      AND 
sa.date='2006-08-30' 
soll nur teil der Abfrage sein, wenn es auch einen eintrag in der Tabelle stat_aktion am 2006-08-30 mit der entsprechenden a.aktionID gibt.
Gibt es diesen Eintrag nicht soll dieser Join nicht bestandteil der Abfrage sein.

Eine zusätzliche Abfrage im Vorfeld ist hier aufgrund der komplexität nicht möglich.

Ich bin über jeden Tipp sehr dankbar

Atze
Mit Zitat antworten
  #2 (permalink)  
Alt 30-08-2006, 23:14
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

mache auch einem INNER JOIN ein LEFT JOIN und füge WHERE sa.irgendwas IS NULL hinzu.
Mit Zitat antworten
  #3 (permalink)  
Alt 31-08-2006, 08:20
atzemann
 Newbie
Links : Onlinestatus : atzemann ist offline
Registriert seit: Aug 2006
Beiträge: 4
atzemann ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Moin asp2php,

danke für die Antwort. Muss ich wirklich "WHERE" benutzen und nicht "AND"?
Wenn ich "WHERE" benutzen soll, an welche Stelle muss ich dieses ein setzen?


Atze
Mit Zitat antworten
  #4 (permalink)  
Alt 31-08-2006, 08:37
atzemann
 Newbie
Links : Onlinestatus : atzemann ist offline
Registriert seit: Aug 2006
Beiträge: 4
atzemann ist zur Zeit noch ein unbeschriebenes Blatt
Standard

O.k.
jetzt sieht der Code so aus:
PHP-Code:
SELECT a.aktionID,a.kundenID,a.max_klick,a.max_viewa.eigen
    FROM aktion a
    
    INNER JOIN kunden_konto k ON a
.kundenID=k.kundenID
      
AND (k.klick>='1' or a.eigen='1')
      AND (
k.view>='1' or a.eigen='1')

   AND 
a.aktiv='1'
 
   
LEFT JOIN stat_aktion sa ON a.aktionID=sa.aktionID
      
AND (sa.klick a.max_klick or a.max_klick='-1')
      AND (
sa.view a.max_view or a.max_view='-1')
      AND 
sa.date='2006-08-30'
     
WHERE sa.date IS NULL
    
    ORDER BY rand
()
    
LIMIT 0,
Jetzt ist zwar so, daß ich ein Ergebniss bekomme, wenn sa.date NULL ist.
Wenn sa.date allerdings schon einen Wert hat, dann bekomme ich kein Ergebnis.

Mein Ziel ist es allerdings, in beiden Fällen ein Ergebnis zu bekommen. Wenn also sa.date NULL ist soll der JOIN
PHP-Code:
   LEFT JOIN stat_aktion sa ON a.aktionID=sa.aktionID
      
AND (sa.klick a.max_klick or a.max_klick='-1')
      AND (
sa.view a.max_view or a.max_view='-1')
      AND 
sa.date='2006-08-30' 
nicht ausgeführt werden!
Wenn sa.date <> NULL ist soll der JOIN aus geführt werden.

Bitte Hilfe.
Atze
Mit Zitat antworten
  #5 (permalink)  
Alt 31-08-2006, 11:24
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

Und wenn du das WHERE einfach rausnimmst?
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
Mit Zitat antworten
  #6 (permalink)  
Alt 01-09-2006, 14:39
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@atzemann, Sorry, soll natürlich

... WHERE NOT sa.whatever IS NULL

somit filterst du die Ausgabe und bekommst nur noch Daten, wo sa.date<>NULL ist
Mit Zitat antworten
  #7 (permalink)  
Alt 02-09-2006, 00:58
atzemann
 Newbie
Links : Onlinestatus : atzemann ist offline
Registriert seit: Aug 2006
Beiträge: 4
atzemann ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

ich habe mittlerweile schon viele Varianten durchprobiert. Auch die von Dir genannte. Ich habe auch schon viele Foren durch.

Das Problem ist eben, daß scheinbar sa.blabla einen Wert gespeichert haben muss, damit alles so funktioniert, wie es meinem kranken Hirn entsprung ist.
Ich habe aufgegeben <= also das Skript läuft mittlerweile. Ich habe jetzt nur zwei zusätzliche Datenbankabfragen im Vorfeld laufen, die prüfen welche Werte sa.blabla hat und fügt dann die fehlenden Werte ein.
Schade ich wollte eigentlich zusätzlich Abfragen sparen, weil in dem Skript schon sehr viele drin sind und dieses Skript sehr sehr sehr oft laufen wird.

Vielleicht kann ich noch ein paar Abfragen sparen, wenn ich ein paar Datenbankabfragen in Dateien auslager - obwohl ich das immer sehr beknackt finde.

Danke für Deine Hilfe, die zwar zur Lösung des Problemes geholfen hat, durch die ich aber wieder etwas gelernt habe.

Atze
Mit Zitat antworten
  #8 (permalink)  
Alt 07-09-2006, 08:58
h0nki
 Newbie
Links : Onlinestatus : h0nki ist offline
Registriert seit: Jan 2005
Beiträge: 37
h0nki ist zur Zeit noch ein unbeschriebenes Blatt
Standard

und wenn du das ganze über eine procedure machst?
dann hast du zwar in der procedure auch mehrere anfragen (2 um genau zu sein), aber du bleibst auf dem server.
zurzeit holst du ja erst einen ergebnissatz, wertest den mit php aus und schickst dann wieder eine sql anfrage oder?
mit einer procedure würdest die ganze zeit auf dem sql server bleiben bei 1 anfrage (natürlich 2 select anfragen in der procedure selbst)
weiß nich ob dir das weiterhilft
Mit Zitat antworten
  #9 (permalink)  
Alt 07-09-2006, 09:01
closure
 Master
Links : Onlinestatus : closure ist offline
Registriert seit: Mar 2006
Beiträge: 796
closure ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@honki && OP

perfomancemäßig ist das auf jedenfalll ein gewinn. Die procedures
werden "kompiliert" und optimiert auf dem server gespeichert.
D.h. der teuere optimierungsvorgang fällt bei vielen abfragen nicht
mehr an. Ausserdem verkleinert sich dadurch deine schnittstelle.

Problematisch generell ist ob es sinnvoll ist logik in der db abzulegen.
Da scheiden sich die geister.


greets
__________________
(((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")
Mit Zitat antworten
  #10 (permalink)  
Alt 07-09-2006, 09:04
h0nki
 Newbie
Links : Onlinestatus : h0nki ist offline
Registriert seit: Jan 2005
Beiträge: 37
h0nki ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ich weiß dass sybase und oracle und so cached, aber auch mysql?
das wäre ja wahnsinn ^^
aber der cache wird ja nur angewandt, wenn der befehl nahezu identisch ist. hab schon gehört, dass es wegen "zuvielen" leerzeichen manchma nicht als gecachter befehl erkannt wird
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 21:01 Uhr.