Vinnaren i pepparkakshustävlingen!
2011-05-26, 22:01
  #1
Medlem
Bigtimepommess avatar
Tjena flashback!
Startar denna tråd för att kunna få svar på de problem jag stöter på.

Mitt första "problem" är att jag inte är helt säker på hur jag ska kolla om ett X antal användare finns i min tabell. Det går ju att kolla en och en mot databasen, men det måste finnas ett smidigare sätt.

Det är såhär att just nu hämtar jag en lista med namn från en hemsida (brukar ligga på ca 200-400st) och stoppar in dom i en array. Dessa namn vill jag stoppa in i min tabell om dom inte redan finns där. Just nu kör jag en for-loop som kollar varje namn mot databasen, om den inte finns så stoppar jag in den.

Jag är nästan 100% säker att detta är ett väldigt långsamt och (ostabilt?) sätt att göra det. Jag menar 300 sqlfrågor som kollar om 300 namn finns i listan.. och sedan ytteligare 300 till om de 300 i listan inte fanns. Frågan är nu hur jag ska kunna lösa detta med så få frågor som möjligt/det effektivaste sättet!

Väntar ivrigt på svar!
Citera
2011-05-26, 22:32
  #2
Medlem
kh31d4rs avatar
sätt UNIQUE på kolumnen så kommer bara namnen som inte redan finns att läggas till.
Citera
2011-05-26, 22:34
  #3
Medlem
Bigtimepommess avatar
Citat:
Ursprungligen postat av kh31d4r
sätt UNIQUE på kolumnen så kommer bara namnen som inte redan finns att läggas till.
Innebär det att jag inte måste göra en SELECT blabla FROM för att kolla först då?

EDIT: Tydligen inte! nere på ca 300 frågor istället nu då. Är det bättre att knåda ihop EN gigantiskt sqlfråga istället för 300~~?
__________________
Senast redigerad av Bigtimepommes 2011-05-26 kl. 22:49.
Citera
2011-05-26, 22:57
  #4
Medlem
z0mfg(ish)s avatar
Nej, fältet (i tabellen) ska vara unique. Om du då försöker stoppa in ett likadant namn får du fel 1062 "Duplicate entry '(entry)' for key (nånting)".

Och du kan väl inte göra flera inserts i samma SQL-fråga, såvitt jag vet, å andra sidan kan du ju använda prepared statements (eller stored procedures kanske funkar i detta fall också), det förbättra prestandan en del.
Citera
2011-05-26, 23:03
  #5
Medlem
Bigtimepommess avatar
Citat:
Ursprungligen postat av z0mfg(ish)
Nej, fältet (i tabellen) ska vara unique. Om du då försöker stoppa in ett likadant namn får du fel 1062 "Duplicate entry '(entry)' for key (nånting)".

Och du kan väl inte göra flera inserts i samma SQL-fråga, såvitt jag vet, å andra sidan kan du ju använda prepared statements (eller stored procedures kanske funkar i detta fall också), det förbättra prestandan en del.
Ahh, är nog sant det. Och ang "stored procedures" så har jag inte en aning om vad det är
Citera
2011-05-26, 23:44
  #6
Medlem
kh31d4rs avatar
man kan göra mer än en insert per query. i MySQL till exempel kan man göra

Kod:
INSERT INTO tabell
VALUES (null, 'värde'), (null, 'värde2'), (null, 'värde3');
Citera
2011-05-26, 23:47
  #7
Medlem
z0mfg(ish)s avatar
Citat:
Ursprungligen postat av kh31d4r
man kan göra mer än en insert per query. i MySQL till exempel kan man göra

Kod:
INSERT INTO tabell
VALUES (null, 'värde'), (null, 'värde2'), (null, 'värde3');
Smutt, ska testas.
Bättre prestanda än att låta PHP iterera 300 gånger och göra en fråga varje gång gissar jag?
Citera
2011-05-26, 23:52
  #8
Medlem
kh31d4rs avatar
Citat:
Ursprungligen postat av z0mfg(ish)
Smutt, ska testas.
Bättre prestanda än att låta PHP iterera 300 gånger och göra en fråga varje gång gissar jag?

jag vet inte hur bra php är på att hålla anslutningar öppna och cache:a saker så det är svårt att bedöma hur stor prestandavinst det är, och om det inte rör sig om mer än 300 queries lite ibland så kan man ju ifrågasätta hur viktigt det är.
Citera
2011-05-29, 21:28
  #9
Medlem
Sätt in dem i en temp-tabell och gör en insert med join till user-tabellen.

Kod:
INSERT User(username, blablabla)
SELECT T.Username, T.blablabla
FROM #Tmp T
LEFT JOIN User U ON U.username = T.Username
WHERE U.Username IS NULL
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback