Kom ihåg mig?

Varför funkar inte denna SQL query?

Ämnesverktyg Visningsalternativ
Oläst 2013-11-06, 13:44 #1
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
Standard Varför funkar inte denna SQL query?

Hej,
jag har lite problem med en query..

UPDATE OfferCode SET status = 1, usedDate = '2013-01-01' WHERE id = (SELECT id FROM OfferCode WHERE code = 'vip' ORDER BY usedDate LIMIT 1)

anledning till att jag väljer att göra så är att db har dubletter av samma "code", och då vill jag endast uppdatera den första raden.

dvs
Kod:
[dbo.OfferCode]
code     status     usedDate 
vip        0           2013-01-01
vip        0           2013-01-01
vip        0           2013-01-01
xxx       0           2013-01-01
yyy       0           2013-01-01
zzz        0           2013-01-01
ERROR [HY000] [MySQL][ODBC 5.1 Driver][mysqld-5.5.34]You can't specify target table 'OfferCode' for update in FROM clause

Det jag är ute efter att kunna uppdatera första raden med "code=vip" och sätta om statusen till "1"

Kod:
[dbo.OfferCode]
code     status     usedDate 
vip        1           2013-01-01
vip        0           2013-01-01
vip        0           2013-01-01
xxx       0           2013-01-01
yyy       0           2013-01-01
zzz        0           2013-01-01

Senast redigerad av naak2803 den 2013-11-06 klockan 13:49
naak2803 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-11-06, 14:09 #2
ANttila ANttila är inte uppkopplad
Medlem
 
Reg.datum: Aug 2013
Inlägg: 81
ANttila ANttila är inte uppkopplad
Medlem
 
Reg.datum: Aug 2013
Inlägg: 81
Kod:
UPDATE OfferCode SET status = 1 WHERE code = 'vip' ORDER BY usedDate LIMIT 1
Är jag helt ute o cyklar nu, eller är det så här du vill ha det?

Senast redigerad av ANttila den 2013-11-06 klockan 14:11
ANttila är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-11-06, 14:09 #3
H S Consulting H S Consulting är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2013
Inlägg: 29
H S Consulting H S Consulting är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2013
Inlägg: 29
Det går inte att köra en select subquery mot samma tabell som ska uppdateras.
Finns det någon förklarlig anledning till att du intehar ett fält i tabellen med auto increment så att varje post får ett unikt ID som du kan använda i din query?
H S Consulting är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-11-06, 14:52 #4
allstars allstars är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Apr 2006
Inlägg: 2 126
allstars allstars är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Apr 2006
Inlägg: 2 126
Rätt smalt designad tabell måste jag säga.

Så här skulle jag gjort en tabell för kuponger

ID (int eller guid) - Index
Identifier (varchar) - Den kod som användaren fyller i
Enabled (bool) - om kupongen är aktiv
ValueSEK (int) - Det som dras av, i SEK
ValuePercent (decimal) - Det som dras av, i procent
IssueDate (datetime) - När är den skapad
ValidToDate (datetime) - Hur länge den ska vara giltig
IssuedToUser (int) - Om kupongen gäller en viss användare, annars 0
ValidCount (int) - Hur många kuponger som finns, 0 för obefintliga
MultiplePerUser (bool) - Om samma användare kan använda kupongen flera gånger

Möjliga påbyggnationer är att man kan ange produktID som kupongen gäller för.


Sedan gärna komplettera med en tabell som säger vilken användare som använt vilken kod, för kontrollera om användaren använt den innan. Då räknar man inte ner ValidCount utan slår upp i den andra tabellen och jämför med värdet i ValidCount.
allstars är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-11-06, 17:24 #5
Westmans avatar
Westman Westman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jun 2004
Inlägg: 4 021
Westman Westman är inte uppkopplad
Klarade millennium-buggen
Westmans avatar
 
Reg.datum: Jun 2004
Inlägg: 4 021
Kort svar: Stored procedure.
Westman är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-11-06, 18:02 #6
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av naak2803 Visa inlägg
Hej,
jag har lite problem med en query..

UPDATE OfferCode SET status = 1, usedDate = '2013-01-01' WHERE id = (SELECT id FROM OfferCode WHERE code = 'vip' ORDER BY usedDate LIMIT 1)

anledning till att jag väljer att göra så är att db har dubletter av samma "code", och då vill jag endast uppdatera den första raden.

dvs
Kod:
[dbo.OfferCode]
code     status     usedDate 
vip        0           2013-01-01
vip        0           2013-01-01
vip        0           2013-01-01
xxx       0           2013-01-01
yyy       0           2013-01-01
zzz        0           2013-01-01
ERROR [HY000] [MySQL][ODBC 5.1 Driver][mysqld-5.5.34]You can't specify target table 'OfferCode' for update in FROM clause

Det jag är ute efter att kunna uppdatera första raden med "code=vip" och sätta om statusen till "1"

Kod:
[dbo.OfferCode]
code     status     usedDate 
vip        1           2013-01-01
vip        0           2013-01-01
vip        0           2013-01-01
xxx       0           2013-01-01
yyy       0           2013-01-01
zzz        0           2013-01-01
Du har ju ingen primärnyckel i tabellen!!!! Då går det inte att adressera enstaka rader om det finns duplicerade datavärden. Man bygger ALDRIG en relationsdatabas utan primärnyckel!!!

Det är i och för sig en sanning med modifikation eftersom man kan använda ROWID som brukar finnas i alla moderna relationsdatabaser, det är ett unikt id som man kan använda i nödfall, men inget man ska bygga sin applikation på för det funkar olika beroende på vilken databasmotor det är.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-11-06, 18:51 #7
pelmereds avatar
pelmered pelmered är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: May 2010
Inlägg: 1 342
pelmered pelmered är inte uppkopplad
Har WN som tidsfördriv
pelmereds avatar
 
Reg.datum: May 2010
Inlägg: 1 342
Citat:
Ursprungligen postat av allstars Visa inlägg
Rätt smalt designad tabell måste jag säga.

Så här skulle jag gjort en tabell för kuponger

ID (int eller guid) - Index
Identifier (varchar) - Den kod som användaren fyller i
Enabled (bool) - om kupongen är aktiv
ValueSEK (int) - Det som dras av, i SEK
ValuePercent (decimal) - Det som dras av, i procent
IssueDate (datetime) - När är den skapad
ValidToDate (datetime) - Hur länge den ska vara giltig
IssuedToUser (int) - Om kupongen gäller en viss användare, annars 0
ValidCount (int) - Hur många kuponger som finns, 0 för obefintliga
MultiplePerUser (bool) - Om samma användare kan använda kupongen flera gånger

Möjliga påbyggnationer är att man kan ange produktID som kupongen gäller för.


Sedan gärna komplettera med en tabell som säger vilken användare som använt vilken kod, för kontrollera om användaren använt den innan. Då räknar man inte ner ValidCount utan slår upp i den andra tabellen och jämför med värdet i ValidCount.
Det känns betydligt vettigare med en tabell med själva kuponginformationen och sedan ytterligare en kopplingstabell kopplad till användartabellen där information om själva transaktionen som t.ex. belopp, datum och vilken användare som använt kupongen(både användar-id och kupong-id).
Man vill separera entiteten(kupongen) med den här typen av metadata. En kupongkod ska bara finnas på ett ställe och om den används flera gånger så ska man skapa flera referenser, inte flera rader i kupongtabellen.
pelmered är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 
Ämnesverktyg
Visningsalternativ

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 00:07.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017