droom: Komplexer mysql-Abfrage

Hi folks,

Habe 2 Tabelle in meiner DB, die (simplifiziert) so aussehen:

(users-Tabelle)
--------------|
users|content |
--------------|
2    |45,67   |
--------------|
3    |45      |
--------------|

(content-Tabelle)
-----------|
id |bodytxt|
-----------|
45 | text1 |
-----------|
56 | text2 |
-----------|
67 | text3 |
-----------|

ich möchte gern nun mit nur einer Mysql-Abfrage die id und bodytxt von "content"-Tabelle, die der User mit id=3 nicht gelesen hat.
Sprich, ich sollte sowas bekommen:
-----------|
id |bodytxt|
-----------|
56 | text2 |
-----------|
67 | text3 |
-----------|

Sollte sowas in der Art: (pseudo-code)
select id.content,bodytxt.content from content,users where id.content!in_array(users.content)

  1. Hab den pseudo-code eben falsch geschrieben. Dachte an:

    select id.content,bodytxt.content from content,users where id.content!in_array(users.content) and users.users=3

  2. Hi droom!

    Hast du die Möglichkeit, weiter zu normalisieren?
    Indem du die IDs komma-separiert abspeicherst, machst du dir ja eben jenen Vorteil zunichte, dass es IDs sind.

    Besser wäre eine Tabelle "ReadContent" mit user_id und content_id, die natürlich als Fremdschlüssel auf die jeweiligen Spalten deklariert werden.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Nee, ich habe es so in einem existierenden System. Die Möglichkeit mit where ...IN () geht nur wenn in IN() ein element drin steht. Array-like Strings werden nicht unterstützt.

      1. Hmm es scheint als wäre where in() doch das richtige aber kann mir einer sagen,warum mit folgende struktur:

        (users-Tabelle)
        --------------|
        users|content |
        --------------|
        2    |45,67   |
        --------------|
        3    |45      |
        --------------|

        (content-Tabelle)
        -----------|
        id |bodytxt|
        -----------|
        45 | text1 |
        -----------|
        56 | text2 |
        -----------|
        67 | text3 |
        -----------|

        SELECT * FROM content WHERE id NOT IN (45,67) mir wirklich die zeile mit id=56 zurückgibt (korrekt) und
        SELECT * FROM content WHERE id NOT IN (select content from users where users='2') mir zeile 56 und 67 zurückgibt.

  3. Hallo,

    Habe 2 Tabelle in meiner DB, die (simplifiziert) so aussehen:

    (users-Tabelle)
    --------------|
    users|content |
    --------------|
    2    |45,67   |
    --------------|
    3    |45      |
    --------------|

    es ist eine sehr schlechte Idee, Daten so abzuspeichern.

    ich möchte gern nun mit nur einer Mysql-Abfrage die id und bodytxt von "content"-Tabelle, die der User mit id=3 nicht gelesen hat.

    Bei vernünftigem Tabellendesign ist das kein Problem. Es ist keine gute Idee, an kaputtem Tabellendesign zu kleben, insbesondere dann nicht, wenn man existierende Tabellen mit schlechtem Design durch Views gleichen Inhalts ersetzen kann.

    Freundliche Grüße

    Vinzenz

  4. Servus,

    (users-Tabelle)
    --------------|
    users|content |
    --------------|
    2    |45,67   |
    --------------|
    3    |45      |
    --------------|

    Ändere dein Tabellen-Design, richtig wäre:
    --------------|
    users|content |
    --------------|
    2    |45      |
    --------------|
    2    |67      |
    --------------|
    3    |45      |
    --------------|

    Es macht wenig Sinn Auswirkungen zu bekämpfen, solang du deren Ursache verhindern kannst.

    Gruss
    Patrick

    --
    sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|