Willkommen bei Entwickler-Forum.
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 16
  1. #1
    Stammgast
    Registriert seit
    26.02.2003
    Ort
    Hattingen
    Beiträge
    1.363

    Standard MySQL Abfrage liefert zwei Datensätze, aber nur einer soll angezeigt werden

    Wir wollen ein Shop-System an unsere Bedürfnisse anpassen. Mit der MySQL Abfrage sollen alle Produkte einer bestimmten Artikelkategorie ermittelt werden. Der eingeloggte Kunde hat einen bestimmten Rabattsatz für jede Kategorie. Bei einigen Artikeln dieser Kategorie bekommt er jedoch einen besonderen Rabatt. In der verknüpften Tabelle ist also ein Eintrag mit product_id 0 und dem Standardrabatt und einer mit einer bestimmten product_id und dem speziellen Rabatt.
    Code:
    left join " . TABLE_CUSTOMERS_DISCOUNT  . " cd 
       on cd.customers_id ='" .(int) $customer_id. "' 
       and cd.categories_id = '" .(int) $current_category_id. "'                                  
       and IF(cd.product_id !='0',cd.product_id =  p.products_id),
    Das Problem ist, dass der Artikel einmal mit dem speziellen Rabatt, aber auch mit dem Standard-Rabatt angezeigt wird. Wie kann man den Datensatz mit dem Standard-Rabatt ausblenden wenn ein Eintrag mit der aktuellen product_id vorhanden ist?
    Danke - Günther
    Günther

  2. #2
    Forenheld
    Registriert seit
    26.02.2003
    Beiträge
    16.146

    Standard

    Ihn rausfiltern.
    ... speziellen Rabatt!=null oder was auch immer der Standardwert ist.
    Geändert von Christian Marquardt (29.05.2017 um 18:55 Uhr)
    Christian

  3. #3
    Stammgast
    Registriert seit
    26.02.2003
    Ort
    Hattingen
    Beiträge
    1.363

    Standard

    In der Tabelle discount gibt es den Datensatz mit product_id 42 und den mit product_id 0. Beide haben die categorie_id 7.

    In der Tabelle products gibt es zu categorie_id 7 die Datensätze mit product_id 42 und 43.
    Der Datensatz mit product_id 43 wird mit dem discount-Datensatz zu product_id 0 verknüpft, wegen der Übereinstimmung der categorie_id => Standard-Rabatt.
    Der Datensatz mit product_id 42 passt aber zu beiden discount Datensätzen, weil einmal die product_id übereinstimmt => spezieller Rabatt
    und im anderen Fall stimmt die categorie_id überein => Standard-Rabatt.

    Während ein Datensatz untersucht wird müßte MySQL also wissen, dass es noch einen weiteren Datensatz gibt der diesen wieder ungültig macht.

    Wenn das mit MySQL nicht geht, muss man das Abfrageergebnis nachträglich durchlaufen ob eine product_id zweimal gefunden wird und dann den Datensatz mit der cd.product_id 0 rausschmeißen, glaube ich.
    Günther

  4. #4
    Forenheld
    Registriert seit
    26.02.2003
    Beiträge
    16.146

    Standard

    Dann sollte es doch mit einem case ..when gehen, wenn bestimmt werden kann welcher vorrangig ist (anhand der Reihenfolge im case when)
    Christian

  5. #5
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.246

    Standard

    Zitat Zitat von Christian Marquardt Beitrag anzeigen
    Dann sollte es doch mit einem case ..when gehen, wenn bestimmt werden kann welcher vorrangig ist (anhand der Reihenfolge im case when)
    Ich glaube nicht, damit hätte man eine "horizontale" Unterscheidung und könnte Spalten tauschen oder sowas.

    Ich hab die Beschreibung noch nicht richtig verstanden.

    Wenn 2 gleiche Datensätze vorhanden sind, die über kein exaktes Unterscheidungsmerkmal besitzen bzw. kein exaktes Joinkriterium vorliegt, müssten sie sortiert und gewichtet werden anhand der verfügbaren Unterschiede. Das könnte man mit Ranking machen, Windows Funktions, die gibt es aber unter mySQL nicht. Müsste man dann irgendwas basteln. Das ergäbe dann wohl ein brauchbares Filterkriterium.
    Wird vielleicht nicht besonders flott sein, zumindest nicht bei großen Datenmengen.

    Der Join Abschnitt oben sieht so aus, als ob der Product Join offen bleibt, wenn keine Referenz eingetragen ist und damit quasi irgendeine Permutation stattfindet. Ohne Beispieldaten und ein vollständiges Selectstatement alles schwer zu sagen.
    Gruß, defo

  6. #6
    Stammgast
    Registriert seit
    26.02.2003
    Ort
    Hattingen
    Beiträge
    1.363

    Standard

    ist das nicht ein und das selbe? Nur, dass CASE bei vielen Möglichkeiten übersichtlicher ist...

    Code:
     
    CASE case_value
       WHEN when_value THEN when_statement_list
       ELSE else_statement_list
    END CASE
    Code:
    IF search_condition THEN if_statement_list
        ELSE else_statement_list
    END IF
    Günther

  7. #7
    Stammgast
    Registriert seit
    26.02.2003
    Ort
    Hattingen
    Beiträge
    1.363

    Standard

    Ich habe mir Mühe gegeben, nur den wesentlichen Teil der Abfrage zu posten. Aber wenn es hilft, bitte sehr:


    Code:
    $listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, 
    IF(true, p.products_price*(100-cd.Rabatt)/100, NULL) as specials_new_products_price, 
    IF(true, p.products_price*(100-cd.Rabatt)/100, p.products_price) as final_price 
    
    from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p 
    
    left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id  
    left join  " . TABLE_SPECIALS . " s on p.products_id = s.products_id 
    left join " . TABLE_CUSTOMERS_DISCOUNT  . " cd 
       on cd.customers_id ='" .(int) $customer_id. "' 
       and IF(cd.product_id !='0',cd.categories_id = '" .(int) $current_category_id. "' 
       and cd.product_id =  p.products_id, cd.categories_id = '" .(int) $current_category_id. "'),
       " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c 
       
       where p.products_status = '1' 
       and p.products_id = p2c.products_id 
       and pd.products_id = p2c.products_id 
       and pd.language_id = '" . (int)$languages_id . "' 
       and p2c.categories_id = '" . (int)$current_category_id . "'";
    Günther

  8. #8
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.246

    Standard

    Zitat Zitat von Günther Weber Beitrag anzeigen
    Ich habe mir Mühe gegeben, nur den wesentlichen Teil der Abfrage zu posten. Aber wenn es hilft, bitte sehr:
    Helfen tut es kaum, aber besser als nichts bzw als die Zeilen am Anfang. Daten und Tabellendefinition dazu, dann könnte man einigermaßen Aussagen treffen.
    Falls Du Dich wirklich bemüht hast, keine unnötige Information zu liefern, so ist das nicht gelungen bzw. Du bist über das Ziel hinaus geschossen. Ich habe selbst schon häufiger gepostet, ein Problem vor der Veröffentlichung in einem Forum auf das Wesentliche zu reduzieren. Aber das bedeutet nicht bloß, ein paar Zeilen auszuschneiden.

    Reduktion auf das Wesentliche bedeutet, ein funktionierendes Beispiel des Problems zu liefern, minus der Felder, Tabellen und Abfrageteile, die das problematische Ergebnis nicht beeinflussen. Das bedeutet natürlich etwas Mühe, erhöht aber die Chance auf Verständnis und Hilfe. Im Ergebnis hätte man ein Szenario, was in diesem Fall bspw auf die Mehrsprachigkeit verzichtet, eine Zeile weniger in der Where Clause usw.

    Ich sage mal grundsätzlich:
    Der wesentliche Teil einer SQL Abfrage ist die gesamte Abfrage.

    Das gilt vor allem, wenn weder die Felddefinitin, noch die Constraints, noch die Daten der abgefragten Elemente bekannt sind.
    Denn normalerweise gehören Tabellendefinitionen und die Daten, ggf die Indizierung zusätzlich zum Definitionsrahmen, der die Ergebnismenge und ggF. Performance bestimmt. Je weniger Constraints definiert sind, desto wichtiger die Beispieldaten, usw usw.

    Ist das Statement so original oder ist es schon verändert?
    Gruß, defo

  9. #9
    Stammgast
    Registriert seit
    26.02.2003
    Ort
    Hattingen
    Beiträge
    1.363

    Standard

    Ich selbst programmiere nicht an dieser MySQL Abfrage, ich kümmere mich darum dass die Datenbank immer aktuelle Daten aus der Warenwirtschaft bekommt.
    Der Kollege der vor diesem Problem steht will mir aber morgen mehr Informationen zukommen lassen.
    Günther

  10. #10
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.246

    Standard

    Ist ja in Ordnung, nimm es bitte nicht persönlich. Der Kollege kann ja auch hier mitmachen. Mund-zu-Mund-Beatmung macht man ja auch meist auf direktem Weg.
    Will heißen, der Informationstransfer wird idR nicht besser, wenn er über mehrere Personen läuft.

    Mir fehlt leider die Vorstellungskraft ausgerechnet dieses Statement in dem Kontext durch bloße Regelanwendung und Fallableitung zu verbessern. In einem modifizierten Shopsystem erst Recht, das ist sowieo ein heißes Eisen. Ob Ihr Euch auf die Art überhaupt einen Gefallen tut, wage ich zu bezweifeln.

    Also wichtig wäre neben Datenmodel usw. die Frage, ist es bereits modifiziert und wenn ja wie sieht das Original aus?
    Rein Interesse halber, was ist das für ein Shopsystem?
    Gruß, defo

 

 
Seite 1 von 2 1 2 LetzteLetzte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •