Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Komplexe SELECT Abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von jMaxM, 22 Februar 2013.

  1. jMaxM

    jMaxM Neuer Benutzer

    Hallo Zusammen,

    ich habe ziemlich triviale DB Schema, aber trotzdem kann keine richtige SELECT - Abfrage konstruieren...

    Das Problem ist folgende:

    ich habe vier Tabellen: USER, USERSKILL, SKILL und CATEGORY (habe Script zum Erzeugen hinzugefügt)

    Tabelle USER:
    create table user (
    userId int not null primary key auto_increment,
    userName varchar(100),
    userFullName varchar(100),
    userEmail varchar(100)
    );
    Tabelle SKILL:
    create table skill (
    skillId int not null auto_increment primary key,
    skillTitle varchar(100),
    skillDescription varchar(100),
    categoryId int,
    foreign key (categoryId) references category(categoryId) on delete cascade
    );
    Tabelle USERSKILL:
    create table userskill (
    userSkillId int primary key auto_increment not null,
    userId int,
    skillId int,
    selfAssessment varchar(5),
    foreign key (userId) references user(userId) on delete cascade,
    foreign key (skillId) references skill(skillId) on delete cascade
    );
    verknüpft USER und SKILL und lässt USERs sich einschätzen wie gut die bestimmte SKILLS drauf haben (USERSKILL.selfAssessment)!

    Problem: ich suche nach Benutzer (USER) die z. B. Java SE 6 mit der Note (USERSKILL.selfAssessment) <= 2 haben UND auch Spring mit der Note <= 2 können.

    Mein SELECT:

    select uSk.* from userskill uSk WHERE (uSk.skillId = 3 and uSk.selfAssessment <= 2) OR ((uSk.skillId = 1 and uSk.selfAssessment <= 2))

    aber "ER" liefert mir auch Daten von USER die nur EINE der SKILLs drauf haben! Aber ich brauche NUR die Datensätze von Benutzer die BEIDE SKILLs draufhaben!!! Also wenn ich anstatt OR, AND schreibe liefert "ER" mir nichts, ist klar, "ER" betrachtet ein Datensatz pro einmal und der Datensatz kann nicht gleichzeitig uSk.skillId 3 und 1 haben...

    Leider bin ich auf meine "Grenzen" gestoßen und kann leider eine solche Abfrage nicht konstruieren...

    Für die Hinweise oder Ratschläge bin ich sehr dankbar!!!
     

    Anhänge:

  2. akretschmer

    akretschmer Datenbank-Guru

    Ich hoffe, ich hab Dich richtig verstanden.

    Aber zuerst einmal ein 'Anschiss': user ist ein reservierter Name, den sollte man nicht für eigene Tabellen nehmen. Außerdem verwendest Du Zeichenketten im vergleich mit Integer.
    Falls Du nun noch MyISAM nutzen solltest, dann sind Deine Constraints übrigens wertlos.

    So: Du suchst User aus der Schnittmenge zweier Bedingungen... Schnittmenge ... intersect!

    Code:
    test=*# select userid from userskill uSk WHERE uSk.skillId = 1 and (uSk.selfAssessment)::int <= 2 intersect select userid from userskill uSk WHERE uSk.skillId = 3 and (uSk.selfAssessment)::int <= 2;
     userid
    --------
          2
          3
    (2 rows)
     
    
    Das kannst Du nun in Deine Abfrage als WHERE einbauen. Wo ich mir nicht sicher bin: unterstützt MySQL mein 'intersect'?


    Andreas
     
  3. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Hy,

    glaub nicht das MaySql intersect kann.... Kann doch erst ab Version 5 Views.... ;-)

    Code:
    select uSk.*
    from userskill uSk
    WHERE uSk.skillId IN ( 1 , 3 )
    AND uSk.selfAssessment <= 2
    
    Lg
     
    akretschmer gefällt das.
  4. akretschmer

    akretschmer Datenbank-Guru

    Ja, da hab ich wohl zu kompliziert gedacht ...
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Ähm:

    Code:
    test=*# select userid from userskill uSk WHERE uSk.skillId = 1 and (uSk.selfAssessment)::int <= 2 ;
     userid
    --------
          2
          3
          4
    (3 rows)
    
    die 4 gehört da wohl eher nicht rein ...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden