/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[MySQL] Finde rækker som ikke er blevet vi~
Fra : KV


Dato : 01-08-07 22:09

Jeg kan ikke helt finde ud af denne.

Jeg skal finde de rækker, som ikke tidligere har været vist til brugeren.

PHP:
$user = 10

MySQL:

Table: item
id_item, INT

Table: item_seen
id_item, INT
id_user, INT

For hver bruger der ser mit varekatalog, har jeg en række i item_seen
tabellen. Jeg vil gerne tydeligtgøre de varer som IKKE har været set - altså
fremhæve alle linier som en given bruger ikke har set.

Det kan selvfølgelig gøres med at læse hele varekataloget i én query og
efterfølgende se om brugeren har set denne vare, i en anden query, men det
er ret langsomt. Det må kunne gøres i én hurtig query?



 
 
KV (01-08-2007)
Kommentar
Fra : KV


Dato : 01-08-07 22:10

> Det kan selvfølgelig gøres med at læse hele varekataloget i én query og
> efterfølgende se om brugeren har set denne vare, i en anden query, men det
> er ret langsomt. Det må kunne gøres i én hurtig query?

Glemte at skrive, at det er MySQL 5.0.x



Gert Krabsen (01-08-2007)
Kommentar
Fra : Gert Krabsen


Dato : 01-08-07 22:23

KV wrote:
> Jeg kan ikke helt finde ud af denne.
>
> Jeg skal finde de rækker, som ikke tidligere har været vist til brugeren.
>
> PHP:
> $user = 10
>
> MySQL:
>
> Table: item
> id_item, INT
>
> Table: item_seen
> id_item, INT
> id_user, INT
>
> For hver bruger der ser mit varekatalog, har jeg en række i item_seen
> tabellen. Jeg vil gerne tydeligtgøre de varer som IKKE har været set - altså
> fremhæve alle linier som en given bruger ikke har set.
>
> Det kan selvfølgelig gøres med at læse hele varekataloget i én query og
> efterfølgende se om brugeren har set denne vare, i en anden query, men det
> er ret langsomt. Det må kunne gøres i én hurtig query?

Uden at kunne huske, om jeg har prøvet det i MySql:

SELECT item.*
FROM item
WHERE item.id_item NOT IN
(
SELECT item_seen.id_item
FROM ite_seen
)


Den virker i Access...


Muligvis lidt hurtigere med


SELECT item.*
FROM item
WHERE item.id_item NOT IN
(
SELECT DISTINCT item_seen.id_item
FROM item_seen
)


/Krabsen



Henrik Davidsen (02-08-2007)
Kommentar
Fra : Henrik Davidsen


Dato : 02-08-07 18:10

Evt kan man tilføje en

WHERE id_user = 'indsæt her brugerens id'

i den inderste select statement. Det afhænger af om det er en konkret bruger
du skal vise items for, eller om det er generelt.

/Sjang

> SELECT item.*
> FROM item
> WHERE item.id_item NOT IN
> (
> SELECT item_seen.id_item
> FROM ite_seen
> )



Kaj Julius (04-08-2007)
Kommentar
Fra : Kaj Julius


Dato : 04-08-07 00:35


"KV" <nospam@REMOVE.gmail.com> skrev i en meddelelse
news:46b0f662$0$90270$14726298@news.sunsite.dk...
> Jeg kan ikke helt finde ud af denne.
>
> Jeg skal finde de rækker, som ikke tidligere har været vist til brugeren.
>
> PHP:
> $user = 10
>
> MySQL:
>
> Table: item
> id_item, INT
>
> Table: item_seen
> id_item, INT
> id_user, INT
>
> For hver bruger der ser mit varekatalog, har jeg en række i item_seen
> tabellen. Jeg vil gerne tydeligtgøre de varer som IKKE har været set -
> altså fremhæve alle linier som en given bruger ikke har set.
>
> Det kan selvfølgelig gøres med at læse hele varekataloget i én query og
> efterfølgende se om brugeren har set denne vare, i en anden query, men det
> er ret langsomt. Det må kunne gøres i én hurtig query?
>
>

SELECT item.*
FROM item
LEFT JOIN item_seen ON item.id_item = item_seen.id_item AND
item_seen.id_user = 30
WHERE item_seen.id_item IS NULL



Bjørn G (06-08-2007)
Kommentar
Fra : Bjørn G


Dato : 06-08-07 20:36

"KV" <nospam@REMOVE.gmail.com> skrev i en meddelelse
news:46b0f662$0$90270$14726298@news.sunsite.dk...
> Jeg kan ikke helt finde ud af denne.
>
> Jeg skal finde de rækker, som ikke tidligere har været vist til brugeren.
>
> PHP:
> $user = 10
>
> MySQL:
>
> Table: item
> id_item, INT
>
> Table: item_seen
> id_item, INT
> id_user, INT
>
> For hver bruger der ser mit varekatalog, har jeg en række i item_seen
> tabellen. Jeg vil gerne tydeligtgøre de varer som IKKE har været set -
> altså fremhæve alle linier som en given bruger ikke har set.
>
> Det kan selvfølgelig gøres med at læse hele varekataloget i én query og
> efterfølgende se om brugeren har set denne vare, i en anden query, men det
> er ret langsomt. Det må kunne gøres i én hurtig query?
>
>

Da der ikke skal noget data ud fra item_seen, men kun tjekkes for om en
værdi findes,
så ville jeg bruge EXISTS (eller rettere NOT EXISTS), teoretisk burde det
være hurtigere, og overheadet er minimalt

select id_item
from item
where NOT EXISTS( select null
from item_seen
where item_seen.id_item = item.id_item
and item_seen.id_user = $user)

Jeg er ret sikker på at MySQL 5.x kan klare den, men om den subqueryen evt
skal hedde select 1 istedet for null, kan du prøve dig frem med

Mvh Bjørn



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste