Avatar billede hurra Novice
26. oktober 2004 - 10:41 Der er 12 kommentarer og
1 løsning

join næsten ens tabeller

Jeg udfører nogle tests af nogle ting, og alt efter hvordan testen går, putter jeg resultaterne i en tabel, navn_ok eller navn_fejl.

I navn_ok er en kolonne med tidspunktet for testen + en kolonne for hver test der bliver kørt. Disse kolonner findes også i navn_fejl, men der ud over er der også nogle kolunner der beskriver hvad fejlen har været.

Nu har jeg så brug for at få disse data læst ud, men jeg vil gerne ha dem sorteret test tidspunktet, de skal jo naturligvis læses ud, så fejlede og ok test kommer til at stå under hinanden. Der ud over er jeg kun interesseret i at få de koloner ud som findes i navn_ok, og altså de opløsninger der er mere i navn_fejl skal jeg jeg ikke bruge.

Sådan som jeg har lavet det nu kan jeg ikke rigtigt bruge, der kommer først alle data fra navn_ok, derefter alt fra navn_felj i sine helt egne koloner, selv om de hedder det samme.

Er der nogen der kan hjælpe mig med dette ?
Avatar billede arne_v Ekspert
26. oktober 2004 - 10:46 #1
Skal det ikke laves som:

(SELECT a,b,c,d FROM navn_ok)
UNION
(SELECT a,b,c,d FROM navn_fejl)
ORDER BY a
Avatar billede hurra Novice
26. oktober 2004 - 10:58 #2
Det er et ret godt bud, og meget tæt på det jeg ville ha. Det er rigtigt nok at det virker hvis jeg, som du også gør, skriver navnene på de koloner jeg vil ha over. Mit problem er at jeg på forhånd ikke kender navnene på kolonerne ejg skal bruge, så * ville være rart. Evt noget lignende:

( SELECT *
FROM `navn_ok`)
UNION
( SELECT `navn_ok`.*
FROM `navn_fejl`)

Ellers kan jeg da godt starte med at læse kolone navnene ud, og selv lave statement'en med alle navnene i.
Avatar billede hurra Novice
26. oktober 2004 - 11:01 #3
Ps. ved godt at mit exempler der er ret langt fra noget der virker, man bare lige for at vise hvad det er jeg mener håber jeg det giver lidt mening og kan bruges :)
Avatar billede hurra Novice
26. oktober 2004 - 11:41 #4
Nu virker det i mit program, tak for hjælpen arne v, du skal også ha nogle points, sender du ikke lige et svar ?

Jeg skal aligevel i mit program ha alle navnene på tabellerne ud, så det var ikke ret mange linier der skulle tilføjes for at lave den statement der skulle bruges. Her er et lilel udklip af mit program, jeg har klippet lidt i det, men jeg håber det stadig giver lidt mening (laet i bcb6):
      mysql_select_db(myData, Selected.c_str());
      AnsiString cmd = "SHOW FIELDS FROM `" + TableName + " ok`";
      AnsiString SearchCmd;
      if(!mysql_query(myData, cmd.c_str()))
      {
        //Show the names of the columns
        res = mysql_store_result( myData ) ;
        MYSQL_ROW row;

        int Column = 0;
        while(row = mysql_fetch_row(res))
        {
            Column++;
            //Make statement for search
            SearchCmd = SearchCmd+"`"+row[0]+"`,";
        }
        //Remove the last ,
        SearchCmd.Delete(SearchCmd.Length(), 1);

        cmd = "(SELECT " + SearchCmd + " FROM `" + TableName + (AnsiString)" ok`)  \
                  UNION                                                              \
                (SELECT " + SearchCmd + " FROM `" + TableName + (AnsiString)" fail`) \
          LIMIT 0,100";
Avatar billede arne_v Ekspert
26. oktober 2004 - 11:51 #5
svar
Avatar billede hurra Novice
26. oktober 2004 - 11:58 #6
Jeg har lige et tillægs spørgsmål: nu kan det være at samme enhed er tested flere gange. Hvis dette forekommer vil jeg gerne kun kunne vise første gang den blev tested (en af kolonerne er et serial nummer så enhederne kan spores i databasen).

Kan det lade sig gøre i statementen ?
Avatar billede arne_v Ekspert
26. oktober 2004 - 12:19 #7
Den tror jeg er svær.

I 2 trin kunne den laves som:

SELECT MIN(testtid), serial FROM tabel GROUP BY serial

og så have en:

WHERE serial IN (...)

betingelse på de andre SELECT.

Men jeg kan ikke lige se hvordan man kunne kombinere det ned i en sætning.
Avatar billede arne_v Ekspert
26. oktober 2004 - 12:20 #8
vrøvl

WHERE testtid IN (...)
Avatar billede arne_v Ekspert
21. november 2004 - 21:00 #9
Tid at få afsluttet ?
Avatar billede hurra Novice
21. november 2004 - 21:38 #10
Ja, jeg har glemt dig (igen). Jeg har fået det til at køre ved at lave en temporer tabel og indsætte alt data i sorteret rækkefølge efter test tid. Derefter henter jeg data fra den table, og grouper efter serial nummer.

Men jeg har ladet mig fortælle at med mysql ver 4.1.7 (og op efter) skulle det ikke være nødvendig at gemme i den midlertidige tabel, da denne kan lave subqueries.
Avatar billede hurra Novice
21. november 2004 - 21:38 #11
Ups, glemte at trykke accepter :)
Avatar billede arne_v Ekspert
21. november 2004 - 21:44 #12
MySQL 4.1 har fået subqueries
Avatar billede arne_v Ekspert
21. november 2004 - 21:45 #13
svaret er iøvrigt stadig ikke accepteret (man skal markere det navn man vil acceptere
inden man klikker accepter - ellers ignorerer den bare ens klik på accepter !)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester