php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 14.04.2009, 10:24  
Neuer Benutzer
 
Registriert seit: 14.04.2009
Beiträge: 6
Patrick Henning befindet sich auf einem aufstrebenden Ast
Standard Bedingte Anweisung im MySQL-Query?

Hallo Mitglieder dieses Forums,

vor ein paar Wochen hatte ich die Aufgabe bestimmte Informationen, die bei
uns per SQL erfragt werden, bei der Anfrage durch neuere aus einer weiteren
(aktuelleren) Tabelle zu ersetzen. (Es handelt sich dabei um eine neue
Bearbeitungsnummer, die anstelle der alten verwendet werden soll)

Wir haben dazu einen Dispatcher, der Anfragen an die Datenbank vorfiltert und
weiterreicht. Das Dispatcher-Skript darf dabei allerdings nicht verändert
werden, da es zu einem bereits (durch die Regulierungsbehörde) zertifizierten
Verarbeitungssystem gehört.

Die Anfrage selbst im Dispatcher-Skript (PHP) besteht aus zwei
verschiedenenen aufeinanderfolgenden Queries, die unterschiedliche Tabellen
(und Felder) ansprechen, da die Tabellen untereinander verknüpft sind. Die
Daten werden jeweils in einem Array gesammelt und abschliessend
zurückgegeben.

Hier mal stark vereinfacht dargestellt, wie das ungefähr aussieht:

PHP-Code:
function getData$customer$id$filter='' )
{
    
$data = array();
    
$sql "SELECT name, bid FROM tab1 WHERE id = '" $id "'" $filter;
    [..]    
// Daten werden überprüft und in $data umkopiert
    
$bId $result['bid'];

    
$sql "SELECT benutzer, kundennr, bestellnr FROM tab2 WHERE bid = '" $bId "'" $filter;
    [..]    
// Daten werden überprüft und in $data umkopiert
    
[..]    // ... weitere Verarbeitungsschritte
    
return $data;

Jeder Query enthält bereits einen Platzhalter für einen Filter, der bislang nicht
oder nur wenig genutzt wurde (SORT, LIMIT), aber nun für diese Aufgabe
verwendet werden soll.

Die Bearbeitungs-Nummer-Abfrage (die erweitert werden soll) befindet sich im
ersten Query.

Normalerweise würde ich einen UNION-Befehl dafür verwenden, der das
Ergebnis des äusseren SELECTs einfach ersetzt:

PHP-Code:
$filter " UNION SELECT name, bid FROM tab3 WHERE id = '" $id "'"
Soweit, so gut, aber da gibt es noch den zweiten Query in dem nichts
verändert werden soll, aber (zwangsläufig) denselben Filter verwendet. Fazit:
das Skript bricht (berechtigterweise) mit einem Fehler ab.

Ich hab's jetzt zwar aufgegeben, aber neugierig bin ich trotzdem: gibt es denn
überhaupt eine Möglichkeit diesen Filter beim zweiten Query unwirksam zu
machen bzw. gibt es einen Query, bei dem der Filter nur bei einer bestimmten
Bedingung wirksam wird? Eine "Bedingte Anweisung" im Query selbst also?

Ich wäre sehr dankbar für eure Hinweise und Ideen!
Ciao
Patrick Henning ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 14.04.2009, 13:52  
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

Versteh ich nicht. Was hindert Dich daran, die Filtervariable aus der Query herauszunehmen?
__________________
--
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 14.04.2009, 14:33  
Neuer Benutzer
 
Registriert seit: 14.04.2009
Beiträge: 6
Patrick Henning befindet sich auf einem aufstrebenden Ast
Standard

"Versteh ich nicht. Was hindert Dich daran, die Filtervariable aus der Query herauszunehmen?"
Der Code im Dispatcher-Script darf nicht verändert werden. (Steht aber auch in meiner Beschreibung )
Patrick Henning ist offline   Mit Zitat antworten
Alt 14.04.2009, 14:41  
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:
Das Dispatcher-Skript darf dabei allerdings nicht verändert
werden, da es zu einem bereits (durch die Regulierungsbehörde) zertifizierten
Verarbeitungssystem gehört.
Mit Sicherheit gilt diese Zertifizierung dann aber auch im Zusammenhang mit der gesetzten Filtervariablen und dem zu diesem Zeitpunkt aktuellen Datenbanklayout.

Aber wie auch immer, ich befürchte, es gibt keine Bedingungslogik auf der Ebene von UNION bzw. ORDER BY, die die Verwendung derselben regeln kann. Bedingte Verknüpfungen etc. sind mir nicht bekannt.
__________________
--
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 14.04.2009, 15:11  
Neuer Benutzer
 
Registriert seit: 14.04.2009
Beiträge: 6
Patrick Henning befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Mit Sicherheit gilt diese Zertifizierung dann aber auch im Zusammenhang mit der gesetzten Filtervariablen und dem zu diesem Zeitpunkt aktuellen Datenbanklayout.
Jein. Das DB-Layout könnte geändert werden, aber es kann nicht, weil das Verarbeitungssystem bereits feststeht. Und die Filter-Variable ist eine Variable und kann, muss aber nicht gesetzt werden. Allerdings stellt sie momentan den einzigen Lichtblick für uns dar, nicht mehr parallel und umständlich mit einem SQL-Client die neuen B-Nummern zu suchen, auszulesen und händisch zu ändern.

Zitat:
Aber wie auch immer, ich befürchte, es gibt keine Bedingungslogik auf der Ebene von UNION bzw. ORDER BY, die die Verwendung derselben regeln kann. Bedingte Verknüpfungen etc. sind mir nicht bekannt.
Ich hatte angefangen es mit den IF- und CASE-Statements zu probieren. Leider können dort nur statische Werte eingesetzt werden, keine Anweisungen oder Variablen.

Weiterhin hatte ich Set-Operanden im Visier z.B. CORR, allerdings gibt es den nur in der SQL-Syntax (soweit ich herausgefunden habe), nicht für MySQL. Damit hätte ich nämlich eine positionsweise Zuordnung von Feldern (ALL-Operand, per default gesetzt) durch CORR verhindern können, da das SELECT dann nur matchen würde, wenn gesetzte Spaltennamen übereinstimmen. (Das hätte mir z.B. gereicht, weil 'name' und 'bid' im zweiten Query nicht vorkommen). So aber scheitert ein Aufruf der Funktion mit Filter an der unterschiedlichen Anzahl der Spalten im zweiten Query und selbst, wenn das umgangen werden könnte überschreibt es dann ja auch Werte, die gar nicht verändert werden sollen.

Geändert von Patrick Henning (14.04.2009 um 15:46 Uhr).
Patrick Henning ist offline   Mit Zitat antworten
Alt 14.04.2009, 16:22  
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:
Ich hatte angefangen es mit den IF- und CASE-Statements zu probieren. Leider können dort nur statische Werte eingesetzt werden, keine Anweisungen oder Variablen.
Doch doch, das geht schon. Nur eben nicht in diesem Kontext.
__________________
--
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 14.04.2009, 17:02  
Neuer Benutzer
 
Registriert seit: 14.04.2009
Beiträge: 6
Patrick Henning befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Doch doch, das geht schon. Nur eben nicht in diesem Kontext.
Na da bin ich jetzt aber neugierig! Vielleicht gibt's ja doch eine Möglichkeit...
Patrick Henning ist offline   Mit Zitat antworten
Alt 14.04.2009, 18:13  
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

Also ich meine jetzt Ausdrücke und Spalten in IF/CASE Statements.

PHP-Code:
IF(`mycolIS NULL CONCAT(`othercol` , "(default)") , `mycol` * 1000) AS `level
sollte ohne Probleme funktionieren.

Nur ist das innerhalb des SELECT Zweiges oder der ORDER BY Struktur. Außerhalb wird das wohl nicht gehen.
__________________
--
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 16.04.2009, 10:57  
Neuer Benutzer
 
Registriert seit: 14.04.2009
Beiträge: 6
Patrick Henning befindet sich auf einem aufstrebenden Ast
Standard

Okay. Scheint wohl nichts zu gehen.
Danke für die Mühe!
Patrick Henning ist offline   Mit Zitat antworten
Alt 16.04.2009, 11:02  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
Allerdings stellt sie momentan den einzigen Lichtblick für uns dar, nicht mehr parallel und umständlich mit einem SQL-Client die neuen B-Nummern zu suchen, auszulesen und händisch zu ändern.
Ihr "dürft" manuell an der Datenbank rumfummeln, aber kein neues Skript erstellen, das diesen Vorgang automatisch erledigt?
David 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
mysql query browser + umlaute gugu Datenbanken 10 28.03.2009 19:15
MySQL Query zum Ersetzen von sonderbaren Umlauten Carino Datenbanken 13 14.05.2007 18:08
Mysql Query mitloggen cycap Datenbanken 1 03.04.2006 21:36
MySQL Query Browser c01001 Datenbanken 6 14.01.2006 22:13
Lost connection to MySQL server during query in ... ? Alpha Centauri Datenbanken 0 24.10.2005 11:09
verschiedene Query Ergebnisse in MySQL 4.0.x und 4.1.x Datenbanken 3 18.09.2005 15:57
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
Lost connection to MySQL server during query bicpi PHP-Fortgeschrittene 17 02.08.2005 11:42
mysql_query meldet Fehler, MySQL Query Browser nicht Datenbanken 3 04.05.2005 17:15
mysql query... alle datensäze älter als x tage löschen... Sclot Datenbanken 2 05.03.2005 23:04
[Erledigt] Datenbank im MySQL Query Browser PHP Tipps 2005 0 07.02.2005 13:54
mysql query fehler Datenbanken 6 19.01.2005 23:44
mysql update query mit mehreren Tabellen funktioniert nicht PHP-Fortgeschrittene 5 08.01.2005 16:29
mysql anweisung scheinbar falsch lindner PHP Tipps 2004-2 6 07.12.2004 15:04
mysql Fehler - query was empty Anuschka Datenbanken 2 01.09.2004 00:28

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql bedingte abfrage, mysql bedingte anweisung, mysql bedingtes select, mysql bedingtes resultat, bedingte anweisung mysql, mysql bedingte abfragen, mysql update bedingt, mysql bedingtes where, mysql bedingte anweisungen, mysql bedingte where, mysql bedingte sortierung, sql bedingte anweisung, mysql bedingte ausgabe, mysql bedingte query, bedingte anweisung in mysql, php bedingte sql abfrage, mysql bedingte ausdrücke, mysql bedingte zuweisung, mysql bedingt, bedingte abfrage mysql

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