webForumDet fria alternativet

välj ut de som saknas

Databaser & SQL

6 svar · 235 visningar · startad av The_Hulk

Medlem sedan juni 20031 837 inlägg
Frågan#1

Låt oss säga att vi har tabellerna

tbl_alla
(
 id int,
 namn varchar(32)
);

tbl_anvandare
(
 id int,
 namn varchar(32)
);

tbl_valda
(
 id int,
 vald_id int,
 anv_id int
);

med värdena

--- tbl_alla ---
id | namn
-----------------------------------
 1 | 'testar'
 2 | 'att'
 3 | 'välja'
 4 | 'ej'
 5 | 'valda'
-----------------------------------

--- tbl_anvandare ---
id | namn
-----------------------------------
 1 | 'foo'
 2 | 'bar'
-----------------------------------

--- tbl_valda ---
id | vald_id | anv_id 
-----------------------------------
 1 |       1 | 1
 2 |       2 | 2
 3 |       3 | 1
-----------------------------------

nu vill jag ha en SQL-fråga som väljer ut de poster som användare 'foo' INTE har valt.

för att välja de som han valt skriver man ju:

SELECT
    a.id,
    a.namn

FROM
    tbl_alla AS a,
    tbl_valda AS v

WHERE
    v.anv_id = 1 AND
    a.id = v.vald_id

då bör man få

id | namn
-----------------------------------
 1 | 'testar'
 3 | 'välja'
-----------------------------------

men jag vill ha

id | namn
-----------------------------------
 2 | 'att'
 4 | 'ej'
 5 | 'valda'
-----------------------------------

OBS! jag kör mot mySQL 3.23.54

Medlem sedan juni 20031 837 inlägg
#2

Min nödlösning blev att jag först får välja ut de ID från tbl_valda som tillhör 'foo' därefter välja ut all från tbl_alla förutom de som matchar de jag först hämtade ut.

hade det varit SQL-server eller Oracle så hade det varit lätt att göra detta i en SQL-fråga men MINUS/EXCLUDE eller subqueries stöds inte av MySQL än.

Men jag skulle vara väldigt tacksam om någon annan kunde komma på en bättre lösning än denna.

Medlem sedan juni 20019 024 inlägg
#3

Ehh, känns som om du behöver se över din databasdesign istället för sql-frågorna. Vad betyder en tabell som heter "alla" och en som heter "valda"? Du behöver inte förklara för mig, men "tänk efter före". ;)

Medlem sedan dec. 200012 464 inlägg
#4
SELECT a.id,    a.namn
  FROM tbl_alla AS a left join tbl_valda AS v 
      ON a.a.id = v.vald_id
    AND v.anv_id = 1
 WHERE v.vald_id is null
Medlem sedan juni 20031 837 inlägg
#5

Pace skrev:

Ehh, känns som om du behöver se över din databasdesign istället för sql-frågorna. Vad betyder en tabell som heter "alla" och en som heter "valda"? Du behöver inte förklara för mig, men "tänk efter före". ;)

Min databas ser inte ut så. Var bara ett exempel jag gjorde för att förklara vad jag menade.

tbl_alla skulle bara symbolisera en tabell där det fanns många poster och en användare kunde välja några av dem.

tbl_valde är alltså en kopplingstabell för att användaren ska kunna välja några ur tbl_alla

Det är väl inget konstigt med det? Sen vad de heter har ju absolut ingen betydelse för upplägget av databasen. Så länge man själv vet vad allting är så gör det inget. Självklart är det bra med förklarande namn om man vill att andra lätt ska kunna sätta sig in i det.

Medlem sedan juni 20031 837 inlägg
#6

LarsG skrev:

SELECT a.id,    a.namn
  FROM tbl_alla AS a left join tbl_valda AS v 
      ON a.a.id = v.vald_id
    AND v.anv_id = 1
 WHERE v.vald_id is null

tack så jätte mycket, det fugnerade om jag ändrade
ON a.a.id = v.vald_id
till
ON a.id = v.vald_id

misstänker att det blev ett skrivfel

tack ännu en gång

Medlem sedan juni 20019 024 inlägg
#7

The_Hulk skrev:

Min databas ser inte ut så. Var bara ett exempel jag gjorde för att förklara vad jag menade.

tbl_alla skulle bara symbolisera en tabell där det fanns många poster och en användare kunde välja några av dem.

tbl_valde är alltså en kopplingstabell för att användaren ska kunna välja några ur tbl_alla

Okej! :)

The_Hulk skrev:

Sen vad de heter har ju absolut ingen betydelse för upplägget av databasen. Så länge man själv vet vad allting är så gör det inget. Självklart är det bra med förklarande namn om man vill att andra lätt ska kunna sätta sig in i det.

Så länge du är helt själv och sysslar med databasen kontinuerligt, ja. Men varför göra det sämsta av situationen? Om du skulle låta databasen vila i sex månader och därefter komma tillbaka för att administrera den så lovar jag dig att du har svårt att över huvud taget begripa vad tabellerna "alla", "valda", "ejvalda", "inskickade" och allt vad de heter innebär. Jag har själv gjort de misstagen, fast då gäller det inte databaser. ;)

Att göra en bra design från grunden underlättar inte bara framtida administration, det är lättare för andra att sätta sig in i det och det blir dessutom lättare att integrera med andra system.

Ta inte detta som något klagomål utan som ett tips. Den enda som blir lidande för en dålig design är ju du själv. :)

270 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)