ilch Forum » Allgemein » HTML, PHP, SQL,... » weihnachts-sql

Geschlossen
  1. #1
    User Pic
    sinan Mitglied
    Registriert seit
    28.10.2007
    Beiträge
    85
    Beitragswertungen
    0 Beitragspunkte
    hallo leute,

    mein problem ist etwas merkwürdig zu erklären, deshalb versuche ich es an einem für die jahreszeit entprechenden beispiel zu erklären ?

    ich habe folgende datanbank-tabelle:

    diese tabelle hat 3 spalten:
    • spalte 1: fortlaufende id (hier eher unwichtig) (id)
    • spalte 2: name des kindes (kindsname)
    • spalte 3: geschenk des kindes (geschenk)


    die tabelle ist gefüllt mit haufenweise geschenken. es kann aber auch vorkommen, dass z.b. hans und erwin das selbe geschenk bekommen haben oder sogar mehrere geschenke gleich haben.(soll ja vorkommen)

    ich lasse mir erstmal ausgeben, wer denn alles eine playstation 3 bekommen hat.

    select kindsname from tabelle where geschenk = 'playstation 3'


    damit hätte ich dann also alle kinder, die ne ps 3 zu weihnachten bekommen haben.

    wie bekomme ich jetzt alle kinder, die ne ps 3 und ne kack xbox geschenkt bekommen haben. also alle kinder, die zwei gleiche geschenke haben ?

    ich hab den kack schon durch zig schleifen gejagt und komme dann auf ein anständiges ergebnis aber wie geht das direkt per sql ? ich steh mega aufm schlauch?

    so gehts ja auch nicht ->
    select kindsname from tabelle where geschenk = 'playstation 3' and geschenk = 'kack xbox'


    mit vor weihnachtlichen grüßen, danke für die hilfe :p
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    she Mitglied
    Registriert seit
    13.11.2010
    Beiträge
    1.115
    Beitragswertungen
    82 Beitragspunkte
    ZitatZitat geschrieben von sinan

    select kindsname from tabelle where geschenk = 'playstation 3' and geschenk = 'kack xbox'



    Normalerweiße sollte dieser SQL Befehl führen das er alle anzeigt. Versuch es mal in phpMyAdmin. Also fehler sehe ich darin nicht.
    Google+ shelfinger.eu
    Das Wissen verfolgt mich - doch ich bin schneller!
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    GeCk0 Hall Of Fame
    Registriert seit
    01.05.2009
    Beiträge
    2.989
    Beitragswertungen
    96 Beitragspunkte
    zeig mal den php -code

    falls du error-reporting aus hast könnte es sein das die query ein fals liefert und du es nicht bemerkst
    Alle Module von mir sind nun unter php-gecko.de erreichbar
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    sinan Mitglied
    Registriert seit
    28.10.2007
    Beiträge
    85
    Beitragswertungen
    0 Beitragspunkte
    das muss doch ohne php umzusetzen sein, wenn ich nur den sql string in der db ausführe
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Naja also wenn du weiß welche beiden Geschenke es sind, dann gehts.

    SELECT t1.kindsname FROM tabelle t1
    WHERE t1.kindsname IN (SELECT t2.kindsname FROM tabelle t2 WHERE t2.geschenk = 'playstation 3')
    AND t1.geschenk = 'kack xbox'
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    Ithron Hall Of Fame
    Registriert seit
    21.01.2006
    Beiträge
    2.659
    Beitragswertungen
    24 Beitragspunkte
    Wie speicherst du die Geschenke denn ab? In einem String? Ein String ist eine nichts aussagende Einheit.

    Leg doch ne Geschenke Tabelle an und in der Kindertabelle trägst du in das Geschenkefeld nur die IDs der Geschenke ein. Die IDs trennst du mit einem beliebigen Zeichen.

    Um das ganze dann abzufragen liest du als erstes den Inhalt des Geschenkefelds ein und jagst das durch explode(), wodurch du dann ein Array mit allen IDs bekommst. Dann kannst du die IDs auswerten (oder in deinem Beispiel erst eine Abfrage auf die Geschenke Tabelle um die IDs zu bekommen und dann den Rest machen).

    Das ganze funktioniert natürlich genauso gut mit einem String welcher alle Geschenkenamen beinhält und ein beliebiges Zeichen als Trennzeichen verwendet. Das kannste dann auch exploden. Nachteil ist natürlich das im Geschenkenamen das Trennzeichen vorkommen kann und du somit zwei ungültige Ergebnisse bekommst.

    Oder du änderst die Abfrage auf WHERE `geschenk` LIKE "%playstation 3%"
    Somit bekommst du dann alle Kinder in derem Geschenkefeld der String "playstation 3" vorkommt, unabhängig davon ob davor oder dahinter etwas steht.
    ZitatZitat geschrieben von loW

    Ja ich habs gesehen und wenn ichs kostenlos bekomm dann zahl ich doch nix dafür oder?
    0 Mitglieder finden den Beitrag gut.
  7. #7
    User Pic
    sinan Mitglied
    Registriert seit
    28.10.2007
    Beiträge
    85
    Beitragswertungen
    0 Beitragspunkte
    so freunde der nacht,

    hier also mein geforderter nachtrag zur db-struktur, wobei ich jetzt auch wieder etwas vereinfache aber das tut dem ganzen keinen abbruch.

    es sieht nun folgendermaßen aus:

    -es sind drei tabellen, die irgendwie in einem verhältnis miteinander stehen, ich nenne sie jetzt einfach mal "nutzer,produkte,plz"

    die tabellen sind folgendermaßen gefüllt:

    - nutzer -> die tabelle "nutzer" enthält email-addresse,passwort,geb-daten, name...etc. eines nutzers, wobei jeder nutzer natürlich noch eine eimalige nutzer_id hat (die nutzer sind in dem fall händler)

    - produkte -> die tabelle "produkte" enthält produkte, die der nutzer(händler) verkauft, diese tabelle enthält also produktname,preis..etc. und die einmalige nutzer_id eines verkäufers für ein bestimmtes produkt

    - plz -> in der tabelle plz befinden sich nun 2 für uns wichtige spalten.
    eine postleitzahl(plz_code), an die ein bestimmter verkäufer ein bestimmtes prdukt verschickt und die einmalige nutzer_id aus der tabelle nutzer, die auch schon in der tabelle produkte verwendet wurde.

    wie bekomme ich jetzt infos aus der tabelle produkte und nutzer, für alle nutzer(händler), die ihre produkte nicht nur an eine plz, sondern auch an zwei bestimmte plz verschicken???
    0 Mitglieder finden den Beitrag gut.
  8. #8
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Also von der Sache her sollte in der Produkte Tabelle nicht die nutzer_id sein, weil normalerweise mehrere Verkäufer das gleiche Produkt anbieten können, genau wie ein Verkäufer natürlich mehrere Produkte hat, deswegen macht man dafür eine Extra Tabelle, in der nur nutzer_id und produkt_id sind (ggf. noch mit preis, weil der ja unterschiedlich sein kann oder anderen daten die pro Verkäufer halt anders sind), also von der Sache, wenn du meinst, Produkte sind einmalig, kannst du es natürlich auch lassen.

    Zu deiner Frage, ich nehme also an, in der plz gibts verk(äufer) und best(eller) und du willst wissen, welche verk mehr als eine plz beliefern

    SELECT verk, COUNT(plz) AS plzs FROM plz GROUP BY verk HAVING plzs > 1;

    Damit bekommst du die Verkäufer und die Anzahl von plzs die sie beliefern.
    Du kannst die Abfrage (in abgeänderter Form) auch verschachtelt benutzen um dann andere Informationen für diese Verkäufer, bzw. alle Versendungen zu Bekommen.

    SELECT a.* FROM plz a WHERE a.verk IN (SELECT b.verk FROM plz b GROUP BY b.verk HAVING COUNT(b.plz) > 1) ORDER BY a.verk;
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  9. #9
    User Pic
    sinan Mitglied
    Registriert seit
    28.10.2007
    Beiträge
    85
    Beitragswertungen
    0 Beitragspunkte
    joa naja, ich möchte eigentlich nur wissen, wie ich z.b. einen händler(nutzer) herausfinde, der in z.b. plz='21335' and plz='01217' liefert.
    0 Mitglieder finden den Beitrag gut.
  10. #10
    User Pic
    sinan Mitglied
    Registriert seit
    28.10.2007
    Beiträge
    85
    Beitragswertungen
    0 Beitragspunkte
    also ich habs jetzt mit 2 funktionen und 2 while schleifen hinbekommen. so ziemlich die beschissenste lösung überhaupt denke ich.

    wer sich für ie lösung interessiert, der brüllt laut "ich"... danke nochmal für die hilfe bis dahin, obwohl ichs ja schon gerne in sql gelöst hätte...
    0 Mitglieder finden den Beitrag gut.
  11. #11
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Naja weiter oben steht eigentlich schon ne Lösung für das Problem, halt noch mit dem anderen Beispiel.

    Ansonsten gehts aber auch mit einer while Schleife (Pseudocode)

    $lastverk = 0;
    $array = array();
    $sql = 'SELECT * WHERE plz = '21335' OR plz = '01217' ORDER BY verk';
    while ($r = fetch_assoc($sql)) {
      if ($lastverk == $r['verk']) $array[$r['id']] = $r; //Verk hat beide plz
      $lastverk = $r['verk'];
    }


    Oder mit dem Beispiel vom Kindsname nochmal auf das mit den Verk und plz geändert.

    SELECT t1.verk FROM plz t1
    WHERE t1.verk IN (SELECT t2.verk FROM plz t2 WHERE t2.plz = '21335')
    AND t1.plz = '01217'


    Hab gerade nochmal drüber nachgedacht und die wohl logischste Lösung wäre dann eher
    SELECT verk FROM plz WHERE plz IN ('01217', '21335') GROUP BY verk HAVING COUNT(plz) = 2


    Zuletzt modifiziert von Mairu am 10.12.2010 - 14:53:59
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  12. #12
    User Pic
    SlashLife Mitglied
    Registriert seit
    31.12.2009
    Beiträge
    44
    Beitragswertungen
    7 Beitragspunkte
    ZitatZitat geschrieben von Mairu
    Hab gerade nochmal drüber nachgedacht und die wohl logischste Lösung wäre dann eher
    SELECT verk FROM plz WHERE plz IN ('01217', '21335') GROUP BY verk HAVING COUNT(plz) = 2


    *Ganz* knapp daneben. zwinker

    SELECT verk FROM plz WHERE plz IN ('01217', '21335') GROUP BY verk HAVING COUNT(DISTINCT plz) = 2
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu HTML, PHP, SQL,...

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten