Albert: Nur n-Einträge bei jeder ID

Hallo Forum

ich habe folgende Herausforderung - ich scheitere leider daran!

Ich habe eine MS-SQL-Datenbank und zwei Tabellen.

In der einen Tabelle steht:

Tabelle AUTOMARKEN

ID - AUTO
1 - VW
2 - Audi
3 - Mercedes
4 - Skoda

Tabelle AUTOFARBEN
in der zweiten Tabelle:

IDAUTOMARKEN - FARBE
1 - rot
1 - blau
1 - silber
2 - schwarz
2 - rosa
3 - blau metallic
3 - schwarz
3 - blau
3 - rot
usw.

Jetzt habe ich folgendes Query:

select * from automarken, autofarben where automarken.id = autofarben.idautomarken

Soweit alles klar. Jetzt kann ich aber als User sagen wieviel Ergebnis ich PRO Automarken haben möchte. Dh. ich möchte immer nur die ersten 2 Ergebnisse, das würde beim VW heißen, das beim Ergebnis SILBER rausfällt und beim Mercedes BLAU und ROT.

Hat da jemand einen Tipp für mich? Muss ich das über eine gespeicherte Prozedur und einem Cursor machen?

Danke schon mal!

lg,
Albert

  1. select * from automarken, autofarben where automarken.id = autofarben.idautomarken

    Soweit alles klar. Jetzt kann ich aber als User sagen wieviel Ergebnis ich PRO Automarken haben möchte. Dh. ich möchte immer nur die ersten 2 Ergebnisse, das würde beim VW heißen, das beim Ergebnis SILBER rausfällt und beim Mercedes BLAU und ROT.

    Hat da jemand einen Tipp für mich? Muss ich das über eine gespeicherte Prozedur und einem Cursor machen?

    Mit einer gespeicherten Prozedur funktioniert es sicher. Leider könnte ich dir bei der nicht helfen, da ich noch nie eine verwendet habe.

    Aber mit Subqueries (MS-SQL unterstützt diese, wenn ich recht informiert bin):

    SELECT * FROM Automarken AS AM, Autofarben AS AF WHERE
       AM.ID=AF.IDAutomarken AND AF.ID IN
       ( SELECT ID FROM Autofarben WHERE IDAutomarken=AF.IDAutomarken LIMIT 0, 2 )
                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^
                                         Hier könnte ein Fehler entstehen

    Vielleicht funktioniert das nicht, weil die aktuelle AF.IDAutomarken nicht einfach in den Subquery übernommen werden kann, Wissen tue ich's aber nicht!

    bin mir nicht sicher, ob das funktioniert, da ich es nicht testen kann (mysql unterstützt keine Subqueries). Kannst es ja mal versuchen.

    Viele Grüsse

    Philipp

    1. SELECT * FROM Automarken AS AM, Autofarben AS AF WHERE
         AM.ID=AF.IDAutomarken AND AF.ID IN
         ( SELECT ID FROM Autofarben WHERE IDAutomarken=AF.IDAutomarken LIMIT 0, 2 )
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^
                                           Hier könnte ein Fehler entstehen

      Vielleicht funktioniert das nicht, weil die aktuelle AF.IDAutomarken nicht einfach in den Subquery übernommen werden kann, Wissen tue ich's aber nicht!

      bin mir nicht sicher, ob das funktioniert, da ich es nicht testen kann (mysql unterstützt keine Subqueries). Kannst es ja mal versuchen.

      danke für deine Hilfe - aber LIMIT ist My-SQL Syntax, gibts net in MS-SQL :-(

      Schade, Marmelade

      Ms-SQL-Syntaxler auch hier?

      1. SELECT * FROM Automarken AS AM, Autofarben AS AF WHERE
           AM.ID=AF.IDAutomarken AND AF.ID IN
           ( SELECT ID FROM Autofarben WHERE IDAutomarken=AF.IDAutomarken LIMIT 0, 2 )
                                              ^^^^^^^^^^^^^^^^^^^^^^^^^^
                                             Hier könnte ein Fehler entstehen

        Vielleicht funktioniert das nicht, weil die aktuelle AF.IDAutomarken nicht einfach in den Subquery übernommen werden kann, Wissen tue ich's aber nicht!

        bin mir nicht sicher, ob das funktioniert, da ich es nicht testen kann (mysql unterstützt keine Subqueries). Kannst es ja mal versuchen.

        danke für deine Hilfe - aber LIMIT ist My-SQL Syntax, gibts net in MS-SQL :-(

        Hm. ***sch...***, dann weiss ich nicht mehr weiter. Ich kenne MSSQL nicht, sorry. Dann vielleicht doch mit stored procedures?

        Ms-SQL-Syntaxler auch hier?

        ???

        Viele Grüsse

        Philipp

  2. zu 100% bin ich mir nicht sicher aber unter mySQL würde einfach folgendes genügen:

    select * from automarken, autofarben where automarken.id = autofarben.idautomarken limit 2

    (limit 2 liefert die ersten 2 einträge)

    befehl LIMIT :

    LIMIT [OFFSET],rows

    wobei [OFFSET] optional ist...

    hoffe dir weitergeholfen zu haben...

    mfg cres

    1. select * from automarken, autofarben where automarken.id = autofarben.idautomarken limit 2

      daran habe ich auch gedacht, aber es geht nicht darum (soweit ich verstanden habe) die ersten zwei Einträge auszulesen, sondern die ersten zwei von jeder AutomarkenID. Dazu ist mehr nötig, als ein LIMIT Befehl.

      Gruss

      Philipp

      1. select * from automarken, autofarben where automarken.id = autofarben.idautomarken limit 2

        daran habe ich auch gedacht, aber es geht nicht darum (soweit ich verstanden habe) die ersten zwei Einträge auszulesen, sondern die ersten zwei von jeder AutomarkenID. Dazu ist mehr nötig, als ein LIMIT Befehl.

        ein nochmaliges lesen gab mir die erleuchtung (nicht wirklich, nur das meine antwort falsch ist (sorry!))

        mfg cres

        1. select * from automarken, autofarben where automarken.id = autofarben.idautomarken limit 2

          daran habe ich auch gedacht, aber es geht nicht darum (soweit ich verstanden habe) die ersten zwei Einträge auszulesen, sondern die ersten zwei von jeder AutomarkenID. Dazu ist mehr nötig, als ein LIMIT Befehl.

          ein nochmaliges lesen gab mir die erleuchtung (nicht wirklich, nur das meine antwort falsch ist (sorry!))

          kein Problem! - Wollt dich nur darauf aufmerksam machen, könnte ja sein, dass dir dann noch was in den Sinn kommt.

          Viele Grüsse

          Philipp

  3. Jetzt habe ich folgendes Query:

    select * from automarken, autofarben where automarken.id = autofarben.idautomarken

    Soweit alles klar. Jetzt kann ich aber als User sagen wieviel Ergebnis ich PRO Automarken haben möchte. Dh. ich möchte immer nur die ersten 2 Ergebnisse, das würde beim VW heißen, das beim Ergebnis SILBER rausfällt und beim Mercedes BLAU und ROT.

    Frage: Woher weiß die Datenbank, daß bei VW rot und blau die ERSTEN beiden Ergebnisse sind? Solange da kein Ordnungsindex reinkommt, kannst du wohl nur sicher sein, daß IRGENDZWEI Farben die ersten sind. Es fehlt bei den Farben an einem Primärschlüssel (ich meine, ich habe zwar keine große Ahnung von Datenbanken, aber ein eindeutiger Schlüssel ist nie verkehrt). Deine Fragestellung ist mir aber klar...

    Hat da jemand einen Tipp für mich? Muss ich das über eine gespeicherte Prozedur und einem Cursor machen?

    Ich kenne mySQL, aber mir fällt folgender Ansatz ein:

    Du gibst jeder Farbe noch einen Farbindex mit, der die Anzahl der Farben in der Tabelle zählt. Also

    ID  Farbe     Farbindex
    1 - rot     - 1
    1 - blau    - 2
    1 - silber  - 3

    2 - schwarz - 1
    2 - rosa    - 2

    3 - blau    - 1
    3 - schwarz - 2
    3 - blau    - 3
    3 - rot     - 4

    select * from automarken, autofarben where automarken.id = autofarben.idautomarken AND autofarben.farbindex <= 2 ORDER BY autofarben.farbindex

    Alternativ generierst du den Zähler (irgendwie mit COUNT) beim Query selbst.

    - Sven Rautenberg

    1. Ich kenne mySQL, aber mir fällt folgender Ansatz ein:

      Du gibst jeder Farbe noch einen Farbindex mit, der die Anzahl der Farben in der Tabelle zählt. Also

      ID  Farbe     Farbindex
      1 - rot     - 1
      1 - blau    - 2
      1 - silber  - 3

      2 - schwarz - 1
      2 - rosa    - 2

      3 - blau    - 1
      3 - schwarz - 2
      3 - blau    - 3
      3 - rot     - 4

      select * from automarken, autofarben where automarken.id = autofarben.idautomarken AND autofarben.farbindex <= 2 ORDER BY autofarben.farbindex

      Alternativ generierst du den Zähler (irgendwie mit COUNT) beim Query selbst.

      Hallo Sven,

      die Möglichkeit eines Zählers ist leider nicht möglich. Die Idee wär mir auch schon gekommen :-(

      Er soll einfach nur die ersten 2 anzeigen, die er kriegt.

      lg,
      Albert

      1. Hallo Sven,

        die Möglichkeit eines Zählers ist leider nicht möglich. Die Idee wär mir auch schon gekommen :-(

        Warum nicht? Darfst du die Datenbank nicht verändert und eine neue Spalte hinzufügen?

        Er soll einfach nur die ersten 2 anzeigen, die er kriegt.

        Schätze, das wird dann genau das Problem sein. Wenn MS SQL kein LIMIT kennt, wird die Datenbank immer ALLES selektieren, weil dir in der Farbentabelle einfach essentielle Daten fehlen, die die Auswahl noch weiter einschränken könnten.

        Mit anderen Worten: GEHT NICHT! Jedenfalls nicht ohne Erweiterung der Datenbank.

        lg,
        Albert

        - Sven Rautenberg

        1. Hallo Sven,

          die Möglichkeit eines Zählers ist leider nicht möglich. Die Idee wär mir auch schon gekommen :-(

          Warum nicht? Darfst du die Datenbank nicht verändert und eine neue Spalte hinzufügen?

          Stimmt, die Datenbank darf/soll ich nicht ändern - weiters sind es 10.000e Datensätze!!

          Er soll einfach nur die ersten 2 anzeigen, die er kriegt.

          Schätze, das wird dann genau das Problem sein. Wenn MS SQL kein LIMIT kennt, wird die Datenbank immer ALLES selektieren, weil dir in der Farbentabelle einfach essentielle Daten fehlen, die die Auswahl noch weiter einschränken könnten.

          Mit anderen Worten: GEHT NICHT! Jedenfalls nicht ohne Erweiterung der Datenbank.

          Bin schon am Hinmurksen - ich glaub, der Limit-Befehl nennt sich im MS-Sql (eigentlich T-sql) Top X.

          Mal sehen, was rauskommt.

          Grüße,
          Albert