Avatar billede doodset Nybegynder
07. februar 2002 - 03:19 Der er 14 kommentarer og
1 løsning

INTERSECT

select status from sammetabel where navn = 'navn1' intersect select status from sammetabel where navn = 'navn2'

(skal kun give mig B)

sammetabel indholder
navn,status

kan det lade sig gøre at sætte flere status til navn:
fx.
navn1 har status A og B og C og D 
navn2 har status B og K og L og R
(hvad skal jeg skifte og ud med?)
Avatar billede erikjacobsen Ekspert
07. februar 2002 - 07:46 #1
Uden at have prøvet, så

SELECT t1.status
FROM sammetabel as t1 LEFT JOIN sammetabel as t2
ON t1.status=t2.status
WHERE t1.navn='navn1' and t2.navn='navn2';
Avatar billede proaccess Nybegynder
07. februar 2002 - 08:00 #2
>erikjacobsen: Du behøver vist ikke at lave et LEFT-join i denne situation, da du jo kun vil have de sammenfaldende værdier...

SELECT t1.status
FROM sammetabel AS t1 INNER JOIN sammetabel as t2
ON t1.status=t2.status
WHERE t1.navn='navn1' AND t2.navn='navn2'
Avatar billede erikjacobsen Ekspert
07. februar 2002 - 08:04 #3
Nå ja :) Min omtågede tilstand her til morgen tænkte på
generel "oversættelse" fra INTERSECT ...
Avatar billede proaccess Nybegynder
07. februar 2002 - 08:11 #4
Det er da bare helt i orden... jeg lagde det jo heller ikke ind som et "nyt" svar... ;-)
Avatar billede doodset Nybegynder
07. februar 2002 - 14:52 #5
hvordan skal statuserne i kolonnen status være adskildte?
med ,?
eller mellemrum?
elle hvad?
Avatar billede proaccess Nybegynder
07. februar 2002 - 15:15 #6
Nej udgangspunktet i vores svar, er at du har flere rækker for hvert navn...

navn1 A
navn1 B
navn1 C
navn1 D
navn2 B
navn2 K
navn2 L
navn2 R

(ifølge dit ovenstående eksempel, vil så 'B' fremkomme, da det kun er hér at både navn1 og 2 er representeret)
Avatar billede doodset Nybegynder
07. februar 2002 - 15:19 #7
men kan det ikke lade sig gøre at få sat statuserne i samme:
fx.
navn1 a,b,c,d
navn b,k,l,r
Avatar billede erikjacobsen Ekspert
07. februar 2002 - 15:31 #8
Hvis du har dem adskilt af komma, kan du nok kun gøre det
ved at programmere dig ud af det i et script-sprog (PHP, Perl,
JSP, ASP) og ikke i SQL.
Avatar billede proaccess Nybegynder
07. februar 2002 - 15:36 #9
Det kræver en gennemgang af dine records een for een, hvor du tillægger din statuskolonne til en tekstværdi, som du så kan rapportere, præcis som erikjacobsen skriver...

At en opgave ikke umiddelbart kan lade sig gøre er altså ikke vores skyld, og som så har du ingen ret til at forkaste svarene... da det jo er 100% korrekte svar... at du så ikke er tilfreds med svaret er jo så op til dig selv, men hvis jeg spørger dig "om månen er lavet af gul ost", så betyder det at du siger nej, jo ikke automatisk at du vil hente månen ned til mig for at vise dette... ;-)  Du har dog ret i at månen ikke er lavet af gul ost... og fortjerner således de point jeg ville stille på højkant for et svar.
Avatar billede proaccess Nybegynder
07. februar 2002 - 15:40 #10
Du kunne:

Lave din oprindelige sql, for at finde de status'er, som er relevante...

derefter kan du lave følgende kald, for at finde relevante brugere...
SELECT navn FROM sammetabel WHERE status='B'

derefter kan du finde den pågældendes status'er...
SELECT status FROM sammetabel WHERE navn='navn1'

Dette recordset, kunne du så løbe gennem i et prog.sprog (udenfor MySQL)...
While not rst.eof
  test=test & ", " & rst!status
  rst.movenext
wend
if test<>"" then test=mid(test, 3)
msgbox test
Avatar billede erikjacobsen Ekspert
07. februar 2002 - 15:42 #11
Til gengæld bør du så overveje at bruge MySqls datatype
SET (dvs. mængde). Den er lidt "tricky", så derfor et eksempel:

Opret en tabel som:

  create table s (
    a set('a','b','c','d','e'),
    b set('a','b','c','d','e')
  );

Indsæt nogle rækker som (her bare én):

  insert into s values ('a,b','b,c');

Lav intersection som:

select a,b,make_set(a & b,'a','b','c','d','e') from s;

(giver kun "b" i 3. felt), og union som:

select a,b,make_set(a | b,'a','b','c','d','e') from s;

(giver "a,b,c").

Er det sådan du mener det?
Avatar billede doodset Nybegynder
07. februar 2002 - 15:51 #12
proaccess>> det i to har svaret er jo lige hvad jeg skrev i de 2 første regler af mit indlæg bare med andre ord, spørgsmålet var:

navn1 har status A og B og C og D 
navn2 har status B og K og L og R
hvad skal jeg skifte og ud med?

Det vil være det samme som jeg spørger hvor mange dage er der i første md i året.
det jeg søger er så svar=31 dage.
og ikke svar=Januar
dårligt eksempel :))
Avatar billede erikjacobsen Ekspert
07. februar 2002 - 15:54 #13
Nu skal du ikke skælde ud på os.  :)

Du har skrevet en SQL-sætning, der operer på tupel-niveau,
som ville "virke" hvis MySql have INTERSECT-operationen.

Det var vores udgangspunkt. Sandelig...
Avatar billede doodset Nybegynder
07. februar 2002 - 15:57 #14
og hvis vi nu siger at jeg har to kplonne i min tabel
navn............ status
navn1........... A,B,C,D
navn2........... B,K,L,R

hvis jeg nu sammen ligner statuserne så er de ikke ens, jeg tænkte så om der var noget tegn der fik dem brudt fx. , ; eller what ever.

hvis jeg nu med php
$forsp1 = mysql_query("select status from tabel where navn = '$navn1'");
$sammenlign1 = mysql_fetch_array($forsp1);
og det samme til navn2
hvordan får jeg så bare den bogstav ud af $sammenlign1 og $sammenlign2 der er fælles
er jeg helt på forkert bane??
Avatar billede erikjacobsen Ekspert
07. februar 2002 - 15:58 #15
Undskyld, har du LÆST hvad jeg skrev om SET ?
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