gonzoMD: brauch hilfe bei mySQL

Hab hier ne Query, und dazu die eine oder andere Frage:

SELECT
  journal.VRENUM,
  journal.KUN_NAME1,
  journal.KUN_NAME2,
  journal.KUN_NAME3,
  journal.INFO
FROM
  journal
  INNER JOIN journalpos ON (journal.REC_ID = journalpos.JOURNAL_ID)
  INNER JOIN artikel ON (journalpos.ARTIKEL_ID = artikel.REC_ID)
WHERE
  (journal.QUELLE = 3) AND
  (journal.INFO IS NOT NULL) AND
  (journal.INFO) AND
  (journal.INFO NOT LIKE '%vers%') AND
  (journal.INFO NOT LIKE '%storn%') AND
  (artikel.MENGE_AKT >= 0) AND
  (journal.VRENUM NOT LIKE '%STORNO%') AND
  ((journal.SHOP_STATUS = 1) OR
  (journal.SHOP_STATUS = 2))
GROUP BY
  journal.vrenum

Ich möchte hier alle rechnungen (offen oder in Bearbeitung - SHOP_STATUS)ausgebeh (journal), wo einzelne Artikel (journalpos) auch vorhanden oder = 0 sind(MENGE_AKT >=0). Funktioniert so weit, bis auf dass ich das Problem habe, dass durch die Where Klausel
(artikel.MENGE_AKT >= 0)
nicht die journale, sondern die journalpos ausgeschlossen wurden, und demzufolge die 'fehlerhaften' journale trotzdem angezeigt werden.
habs schon mit DISTINCT versuch, hat aber nicht geklappt.
Ich will an der Datenban nichts verändern da ich lediglich ein Frontend dafür entwerfe. (DB: CAO Faktura - falls irgendwer das kennt)

  1. Versuche anstatt die Tabelle Artikel komplett einzubinden im Frameblock einen Select-Block einzubinen, in dem du dann auch die Where-Klausel 'MENGE_AKT > 0' angeben kannst. Damit verhinderst du das diese WHERE-Klausel im Hauptselect zu Problemen führst:

    INNER JOIN (SELECT ... FROM ARTIKEL WHERE MENGE_AKT >= 0) Art on (...)

    Hab hier ne Query, und dazu die eine oder andere Frage:

    SELECT
      journal.VRENUM,
      journal.KUN_NAME1,
      journal.KUN_NAME2,
      journal.KUN_NAME3,
      journal.INFO
    FROM
      journal
      INNER JOIN journalpos ON (journal.REC_ID = journalpos.JOURNAL_ID)
      INNER JOIN artikel ON (journalpos.ARTIKEL_ID = artikel.REC_ID)
    WHERE
      (journal.QUELLE = 3) AND
      (journal.INFO IS NOT NULL) AND
      (journal.INFO) AND
      (journal.INFO NOT LIKE '%vers%') AND
      (journal.INFO NOT LIKE '%storn%') AND
      (artikel.MENGE_AKT >= 0) AND
      (journal.VRENUM NOT LIKE '%STORNO%') AND
      ((journal.SHOP_STATUS = 1) OR
      (journal.SHOP_STATUS = 2))
    GROUP BY
      journal.vrenum

    1. SELECT
        journal.VRENUM,
        journal.KUN_NAME1,
        journal.KUN_NAME2,
        journal.KUN_NAME3,
        journal.INFO
      FROM
        journalpos
       INNER JOIN journal ON (journalpos.JOURNAL_ID = journal.REC_ID)
       INNER JOIN (SELECT artikel.REC_ID FROM ARTIKEL WHERE MENGE_AKT >= 0) on (journalpos.ARTIKEL_ID = artikel.REC_ID)
      WHERE
        (journal.QUELLE = 3) AND
        (journal.INFO IS NOT NULL) AND
        (journal.INFO >= '') AND
        (journal.INFO NOT LIKE '%vers%') AND
        (journal.INFO NOT LIKE '%storn%') AND
        (artikel.MENGE_AKT >= 0) AND
        (journal.VRENUM NOT LIKE '%STORNO%') AND
        ((journal.SHOP_STATUS = 1) OR
        (journal.SHOP_STATUS = 2))
      GROUP BY VRENUM;

    2. hab das so gemacht, krieg aber ne Fehlermeldung:

      You have an error in your SQL syntax near '(SELECT artikel.REC_ID FROM ARTIKEL WHERE MENGE_AKT >= 0)  artikel on (`journalp' at line 10

      Danke für die Hilfe!!!

  2. yo,

    zum einen solltest du nur die spalten ausgeben, über die du auch gruppiert hast, nur mysql gibt hierbei keine fehlmeldung aus. zum anderen hast du unnötige klammern gesetzt.

    SELECT
      journal.VRENUM,
      journal.KUN_NAME1,
      journal.KUN_NAME2,
      journal.KUN_NAME3,
      journal.INFO
    FROM
      journal
    INNER JOIN journalpos ON (journal.REC_ID = journalpos.JOURNAL_ID)
    INNER JOIN artikel ON (journalpos.ARTIKEL_ID = artikel.REC_ID)
    WHERE

    journal.QUELLE = 3 AND
      journal.INFO IS NOT NULL AND <-- diese anweisung ist eventuell überflüssig
      journal.INFO AND <--- hier fehlt doch was ???
      journal.INFO NOT LIKE '%vers%' AND
      journal.INFO NOT LIKE '%storn%' AND
      artikel.MENGE_AKT >= 0 AND
      journal.VRENUM NOT LIKE '%STORNO%' AND
      journal.SHOP_STATUS IN (1, 2)
    GROUP BY
      journal.vrenum
      journal.KUN_NAME1,
      journal.KUN_NAME2,
      journal.KUN_NAME3,
      journal.INFO

    habe deine anweisung erst mal ein wenig umgeschrieben, bzw. kommentiert. was du genau willst, ist mir leider noch nicht ganz klar.

    Ilja

    1. SELECT
        journal.VRENUM,
        journal.KUN_NAME1,
        journal.KUN_NAME2,
        journal.KUN_NAME3,
        journal.INFO
      FROM
        journal
      INNER JOIN journalpos ON (journal.REC_ID = journalpos.JOURNAL_ID)
      INNER JOIN artikel ON (journalpos.ARTIKEL_ID = artikel.REC_ID)
      WHERE

      journal.QUELLE = 3 AND
        journal.INFO IS NOT NULL AND <-- diese anweisung ist eventuell überflüssig
        journal.INFO AND <--- hier fehlt doch was ???
        journal.INFO NOT LIKE '%vers%' AND
        journal.INFO NOT LIKE '%storn%' AND
        artikel.MENGE_AKT >= 0 AND
        journal.VRENUM NOT LIKE '%STORNO%' AND
        journal.SHOP_STATUS IN (1, 2)
      GROUP BY
        journal.vrenum
        journal.KUN_NAME1,
        journal.KUN_NAME2,
        journal.KUN_NAME3,
        journal.INFO

      so bekomm ich nur die selben Ergebnisse, wie vorher.
      Also, wie ich die Verknüpfungen habe siehst du ja die MENGE_AKT in den Artikel bezieht zich durch die ID ja auf die Journalpositionen, Wenn ich diese WHERE Klausel >=0 benutze werden die Journalpositionen  herausgefiltert,(bemerkt man nur wenn man nicht gruppiert), ich will aber, dass dann das komplette Journal herausgefiltert wird. (Ein Journal ist eine Rechnung, und Ein Journalpos ist ein Artikel innerhalb der Rechnung. (Unterabfrage, aber Wie?)

      1. yo,

        so bekomm ich nur die selben Ergebnisse, wie vorher.

        klar, habe ja erst einmal dir tipps gegeben, was mir so aufgefallen ist. was genau du mit deiner abfrage haben willst, konnte ich leider immer noch nicht verstehen.

        Also, wie ich die Verknüpfungen habe siehst du ja die MENGE_AKT in den Artikel bezieht zich durch die ID ja auf die Journalpositionen

        grundsätzlichhabe ich hier ein verständnisproblem. die spalten MENGE_AKT schließt datensätze in der tabelle artikel aus. dadurch, dass du einen inner join mit den anderen tabellen bildest, wirkt sich das natürlich auf die ergebnismenge aus. aber das ist nicht zwangsläufig so.

        Wenn ich diese WHERE Klausel >=0 benutze werden die Journalpositionen  herausgefiltert,(bemerkt man nur wenn man nicht gruppiert), ich will aber, dass dann das komplette Journal herausgefiltert wird.

        wie gesagt, diese aussagen verstehe ich leider noch nicht. aber versuch mal zu erklären, was du willst, ohne auf die abfrage einzugehen. vielleicht wird es dann klarer.

        Ilja

  3. Bevor da weitergemurkst wird:
    Nicht schlecht wäre es, wenn Du Datentabellen ggf. incl. Beschreibung einzelner Datenfelder lieferst und dann die gewünschte Abfrage möglichst präzise beschreibst und zudem das Problem isolierst, also den Punkt benennst, wo es ungewollt oder gar nicht mehr funzt. (Dabei gehen wir davon aus, dass die Abfrage substantiell in Ordnung ist, also Teilergebnisse liefert. Sollte das nicht der Fall sein, auch das bitte angeben.)

    Es lohnt sich bei solchen Problemen meist ein wenig Zeit in die genaue Problemschreibung zu investieren.