Avatar billede sth Novice
27. april 2001 - 22:16 Der er 34 kommentarer og
1 løsning

Vis forskel på 2 tabeller

Jeg har 2 stk. mysql tabeller der er helt ens med hensyn til opbygning, forskellen er de data der findes i dem ?
Hvordan finder jeg de poster i tabel 1 der ikke findes i tabel 2 ?
Avatar billede repsac Nybegynder
27. april 2001 - 22:28 #1
Snuppet direkte fra SQL-bogen fra IDG-forlag:
A EXCEPT B: Returnerer rækker, der optræder i mængden A, men ikke i mængden B:
Avatar billede repsac Nybegynder
27. april 2001 - 22:32 #2
Følgende kunne være et eksempel ...

SELECT * FROM table1 WHERE etellerandet IN
  (SELECT etellerandet FROM table2
    WHERE nogetandet = nogethelttredje) EXCEPT
SELECT * FROM tabel1 WHERE etellerandet IN
  (SELECT etellerandet FROM table2
    WHERE nogetandet = nogetheltfjerde);
Avatar billede erikjacobsen Ekspert
27. april 2001 - 22:33 #3
EXCEPT er ikke med i MySql 3.21.29-gamma .... Måske i en nyere??

Jeg tror sth bliver nødt til at lave to sorterede udtræk, og så løbe dem
igennem med en flette-algoritme. Kender du den?
Avatar billede repsac Nybegynder
27. april 2001 - 22:33 #4
Hmmm hvis det skal være omvendt mht. til hvad der bliver returneret skal du jo bare bytte om på \"nogethelttredje\" og \"nogetheltfjerde\" ... :o)
Avatar billede sth Novice
27. april 2001 - 22:34 #5
Kunnde du give mig lidt mere kode ? jeg er ikke helt med hvis nu tabel 1 heder \"add_menu\" og tabel 2 heder \"menu\" og jeg ville se dem fra \"add_menu\" der ikke findes i \"menu\" hvad slulle jeg så skrive:
Avatar billede repsac Nybegynder
27. april 2001 - 22:36 #6
Sikke noget møj ... :o)
Tjaehh ... eller skal han bruge noget andet til at adskille hans returnerede data ...
Avatar billede erikjacobsen Ekspert
27. april 2001 - 22:40 #7
Kan du give os create sætningen til de to tabeller, så kan jeg lave en stump
PHP-kode til dig, sth.
Avatar billede sth Novice
27. april 2001 - 22:40 #8
jeg er ikke så erfaren med SQL/mysql, så jeg behøver nok lidt hjælp
Avatar billede sth Novice
27. april 2001 - 22:42 #9
jeg har fundet dette i hjælpen til mysql, der det noget der kan bruges ?
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL
Avatar billede sth Novice
27. april 2001 - 22:43 #10
jeg skulle nok lige sige at jeg ikke arbejder i php, men i asp håber at i stadigvæk kan hjælpe :)
Avatar billede repsac Nybegynder
27. april 2001 - 22:43 #11
=>EJ: du har så vidt som jeg kan se ret. Den findes ikke. Jeg har hurigt lige kigge lidt i doc\'en uden resultat ... Er du sikker på den ikke bare er blevet \"omdøbt\" til et eller andet, andet?
Avatar billede repsac Nybegynder
27. april 2001 - 22:44 #12
=>sth: EJ kan vist det hele ... øv! ... ;o)
Avatar billede sth Novice
27. april 2001 - 22:48 #13
UPS !
min egen kode løste problemet !!!!

altså denne SQLstmt = \"SELECT add_menu.* FROM add_menu LEFT JOIN menu ON add_menu.kategoriNavn=menu.kategoriNavn where menu.kategoriNavn IS NULL\"
Avatar billede erikjacobsen Ekspert
27. april 2001 - 22:54 #14
Ah, ja, en left join kan mange ting. Man skal lave så meget på SQL-serveren,
som muligt, i stedet for i f.eks. PHP. Hmm, jeg skal vist lave mig selv et
eksempel for at se om den virker :)
Avatar billede sth Novice
27. april 2001 - 23:17 #15
ja men det virkede ind til at jeg satte en betingelse mere på, så virker det ikke, for nu kommer der ingen ting ! denne virker:
SQL = \"SELECT add_submenu.* FROM add_submenu LEFT JOIN submenu ON add_submenu.url=submenu.url where submenu.url IS NULL\"

mens denne ikke virker:
SQL = \"SELECT add_submenu.* FROM add_submenu LEFT JOIN submenu ON add_submenu.url=submenu.url where submenu.url IS NULL and submenu.userID =\"& session(\"userID\")
nogen der ved hvorfor ?? oj jeg har undersøgt at der findes rec. med denne userid
Avatar billede erikjacobsen Ekspert
27. april 2001 - 23:27 #16
userID er et tal, ikke ?
Avatar billede sth Novice
27. april 2001 - 23:28 #17
ok jeg kan godt se nu at det selvf ikke vil virke da jeg ko kun laver en SELECT fra add_submenu og ikke fra submenu !!

men hvad kan jeg elles gøre hvis der også skal tages hensyn til at feltet userID i tabelen submenu skal være = session(\"userID\")
Avatar billede sth Novice
27. april 2001 - 23:29 #18
erikjacobsen: kunne du uddybe denne flette-algoritme ?
Avatar billede sth Novice
27. april 2001 - 23:30 #19
jo userid er et tal \"int(8) \"
Avatar billede erikjacobsen Ekspert
27. april 2001 - 23:37 #20
Joh..... hvad med en \"create table\" så jeg kan se hvad jeg skal gøre  :)
Er det alle felter der skal testes på, eller kun ét?
Avatar billede sth Novice
27. april 2001 - 23:42 #21
Tabellerne er ens, dog findes der et felt mere i tabellen der heder submenu, for i denne findes nemlig et felt der heder userid
tabel add_submenu:

Feltnavn Datatype Attributer Nulværdi Standardværdi Ekstra Handling
id  int(6)    Nej    auto_increment  Ændre Slet Primær Indekseret Unik
sort  varchar(10)    Nej  0    Ændre Slet Primær Indekseret Unik
navn  varchar(50)    Ja      Ændre Slet Primær Indekseret Unik
kategoriid  smallint(5)    Ja      Ændre Slet Primær Indekseret Unik
url  varchar(50)    Ja      Ændre Slet Primær Indekseret Unik
slet  char(3)    Nej  JA    Ændre Slet Primær Indekseret Unik
Avatar billede sth Novice
27. april 2001 - 23:45 #22
nå det kunneman ikke !
tabellen ser sådan ud:
id  int(6)   
sort  varchar(10)
navn  varchar(50)
kategoriid  smallint(5) 
url  varchar(50) 
slet  char(3)   

og i tabelen submenu ser sådan ud:
id  int(6)   
sort  varchar(10)
navn  varchar(50)
kategoriid  smallint(5) 
url  varchar(50) 
slet  char(3)   
userID  int(8) 
Avatar billede erikjacobsen Ekspert
28. april 2001 - 00:20 #23
ok - hvad er det for felter, der skal testes om findes i den ene og ikke i
den anden?
Avatar billede sth Novice
28. april 2001 - 00:38 #24
jeg fant selv en løsning som ser ud til at virke:
SQL = \"SELECT add_submenu.* FROM add_submenu LEFT JOIN submenu ON add_submenu.url=submenu.url where submenu.url IS NULL and add_submenu.kategoriid =\" & id



\'Response.Write sql
Conn.Execute (SQL)

Set rs2 = conn.Execute(SQL)
DO WHILE NOT rs2.EOF
id= rs2(\"id\")
navn= rs2(\"Navn\")
url=rs2(\"url\")
KategoriID=rs2(\"KategoriID\")

set rs3 = conn.execute(\"SELECT * FROM submenu WHERE url <> \'\" & url & \"\' and userID= \"&session(\"userID\"))
    if rs3.EOF AND rs3.BOF then
else
end if
Avatar billede erikjacobsen Ekspert
28. april 2001 - 00:44 #25
ok - fletning vil nok være mere effektiv :)
Avatar billede sth Novice
28. april 2001 - 09:00 #26
erikjacobsen : ja det har du nåk ret i, men jeg kender ikke så meget til SQL ! men jeg har tænkt over det, og det jeg har lavet, er det ikke at jeg i den første sql sætning løber igennem ALLE rec. i tabel submenu ?
hvad skal du have af point for at lave en lidt mere elegant løsning?
Avatar billede erikjacobsen Ekspert
28. april 2001 - 09:03 #27
Point? Hvad er nu det for noget? :)

Hvad er et for felter der skal checkes på?
Avatar billede sth Novice
28. april 2001 - 09:11 #28
Det jeg ønsker er at, se alle de poster i tabelen add_submenu der ikke findes i tabelen submenu og hvor userID i tabel submenu er <> fra session(\"userID\"))

kan dette forståes ?
Avatar billede erikjacobsen Ekspert
28. april 2001 - 09:41 #29
Nej :)

Samme id,sort,navn,kategoriid,url, og slet ? Hvornår er 2 poster ens?
Avatar billede sth Novice
28. april 2001 - 09:43 #30
det er de når add_submenu = submenu
Avatar billede sth Novice
28. april 2001 - 09:43 #31
UPS ! glemte lige noget !

det er de når add_submenu.url = submenu.url
Avatar billede erikjacobsen Ekspert
29. april 2001 - 00:14 #32
Et lille eksperiment - ikke helt dine tabeller, men tæt nok på :)

  mysql_connect(\'localhost\',\'rumturisten\',\'ISS\');
  mysql_select_db(\'test\');

  $rs1 = mysql_query(\"select url from t1 order by url\");
  $rs2 = mysql_query(\"select url from t2 order by url\");

  $i1=1; $no1=mysql_num_rows($rs1); $row1=mysql_fetch_row($rs1);
  $i2=1; $no2=mysql_num_rows($rs2); $row2=mysql_fetch_row($rs2);

// udskriver dem, der findes i t2, som ikke findes i t1
// det antages, der ikke er dubletter i url felterne i t1, hhv. t2

  while ($i1<=$no1 && $i2<=$no2) {
    if ($row1[0]==$row2[0]) { // findes i begge, udskrives ikke
      $i1++; $row1=mysql_fetch_row($rs1);
      $i2++; $row2=mysql_fetch_row($rs2);
    } elseif ($row1[0]<$row2[0]) { // findes i t1, men ikke i t2, udskrives ikke
      $i1++; $row1=mysql_fetch_row($rs1);
    } else { //$row1[0]>$row2[0], findes i t2, men ikke i t1, udskrives
      echo \"$row2[0]<br>\\n\";
      $i2++; $row2=mysql_fetch_row($rs2);
    }
  }

  // resten i t2, hvis der er nogen, udskrives også
  while ($i2<=$no2) {
    echo \"$row2[0]<br>\\n\";
    $i2++; $row2=mysql_fetch_row($rs2);
  }

  mysql_free_result($rs1);
  mysql_free_result($rs2);
Avatar billede sth Novice
29. april 2001 - 01:13 #33
hvilket sprog er det lavet i ?

jeg kender kun lidt til asp :)

kan du lave det i ASP ?
Avatar billede erikjacobsen Ekspert
29. april 2001 - 01:19 #34
Åh nej, ASP. Livet er for kort til ASP.... Troede lige, da det var MySql, at det
var til PHP. Ok. Utestet over alle måder, fyldt med ASP-syntaksfejl:

Lav recordset rs1  med \"select url from t1 order by url\"
Lav recordset rs2  med \"select url from t2 order by url\"

while (not rs1.eof) and (not rs2.eof) 
  if rs1(\"url\")=rs2(\"url) then
    rs1.movenext
    rs2.movenext
  else
    if rs1(\"url\")<rs2(\"url\") then
      rs1.movenext
    else
    respose.write rs2(\"url\") & \"<br>\"
    rs2.movenext
    end if
  end if
wend

while not rs2.eof
    respose.write rs2(\"url\") & \"<br>\"
    rs2.movenext
wend
Avatar billede sth Novice
29. april 2001 - 01:27 #35
jeg siger mange tak.

Jeg tester det  i morgen.


mvh sth
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

IT-JOB