Forum » Programiranje » pomoč pri SQL stavku v myphpadmin
pomoč pri SQL stavku v myphpadmin
chuck ::
Rad bi izpisal IDje izdelkov kjer je akcijska cena nižja od redne cene. Idealno za primere, ko je akcijska cena aktualna (med date_start in date_end).
Tabele:
SELECT * FROM `oc_product_special`
product_id
price
date_start (lahko 0000-00-00)
date_end (lahko 0000-00-00)
SELECT * FROM `oc_product`
price
product_id
Nekako v stilu:
display product_id WHERE `oc_product_special`.price > `oc_product`.price AND `oc_product_special`.date_start < now < `oc_product_special`.date_end
Tabele:
SELECT * FROM `oc_product_special`
product_id
price
date_start (lahko 0000-00-00)
date_end (lahko 0000-00-00)
SELECT * FROM `oc_product`
price
product_id
Nekako v stilu:
display product_id WHERE `oc_product_special`.price > `oc_product`.price AND `oc_product_special`.date_start < now < `oc_product_special`.date_end
- spremenil: chuck ()
DamijanD ::
narediš left join iz oc_product p na oc_product_special ps po product_id in po date_start/end
potem pa v where daš
ps.price < p.price
potem pa v where daš
ps.price < p.price
kuall ::
select p.product_id from oc_product p join oc_product_special s on s.product_id = p.product_id where s.price < p.price and getdate() between s.start and s.end
chuck ::
Tega pa ne znam izpeljati, izpis SQL stavka:
rezultati se morajo vpisati v drugo tabelo
Z googlanjem sem prišel približno do sem:
ampak ne deluje, ker ne poznam dobro sintakse SQLa.
SELECT product_id FROM `oc_product_special` WHERE `date_end` <= NOW() <= `date_start` AND `date_end` != 0000-00-00
rezultati se morajo vpisati v drugo tabelo
INSERT INTO `oc_product_to_category`(`product_id`, `category_id`) VALUES (oc_product_special.product_id,406)
Z googlanjem sem prišel približno do sem:
INSERT INTO `oc_product_to_category`(`product_id`,`category_id`) SELECT oc.product_id,406 FROM `oc_product_special` LEFT JOIN oc_product_special AS oc ON oc.date_end <= NOW() <= oc.date_start AND oc.date_end != 0000-00-00
ampak ne deluje, ker ne poznam dobro sintakse SQLa.
DamijanD ::
kaj ti pa javi? Sicer ne poznam točno te sintakse ampak verjetno je problem tukaj:
ON oc.date_end < = NOW() < = oc.date_start AND oc.date_end != 0000-00-00
pričakoval bi
ON oc.date_end < = NOW() AND NOW() < = oc.date_start AND oc.date_end != 0000-00-00
(pa še to se mi bolj logično sliši, da bi end in start obrnil...)
ON oc.date_end < = NOW() < = oc.date_start AND oc.date_end != 0000-00-00
pričakoval bi
ON oc.date_end < = NOW() AND NOW() < = oc.date_start AND oc.date_end != 0000-00-00
(pa še to se mi bolj logično sliši, da bi end in start obrnil...)
bemfa ::
INSERT INTO oc_product_to_category(product_id,category_id) SELECT oc.product_id, 406 AS category_id FROM oc_product_special oc WHERE NOW() BETWEEN oc.date_start AND oc.date_end
chuck ::
Hvala bemfa, deluje, edino eden update bi še bil potreben, vrže mi napako:
1062 - Duplicate entry '6036-406' for key 'PRIMARY'
Baza pričakuje, da se zapisi unikatni, izpis pa se pri nekaterih produktih podvaja.
Začasno sem rešil z INSERT IGNORE INTO, ampak nisem prepričan, če je to dolgoročno ok.
1062 - Duplicate entry '6036-406' for key 'PRIMARY'
Baza pričakuje, da se zapisi unikatni, izpis pa se pri nekaterih produktih podvaja.
Začasno sem rešil z INSERT IGNORE INTO, ampak nisem prepričan, če je to dolgoročno ok.
Ahim ::
Hvala bemfa, deluje, edino eden update bi še bil potreben, vrže mi napako:
1062 - Duplicate entry '6036-406' for key 'PRIMARY'
Baza pričakuje, da se zapisi unikatni, izpis pa se pri nekaterih produktih podvaja.
Začasno sem rešil z INSERT IGNORE INTO, ampak nisem prepričan, če je to dolgoročno ok.
Ti jih pac ni insertalo ... je to zeljen rezultat?
FireSnake ::
Res je, distinct ti da unikate.
Ni mi pa jasno, zakaj INSERTaš tudi id?
Id mora biti auto number, ki ga generira baza.
Tako, da ID pri INSERT izpustiš.
Al jaz nisem dobro prebral ko sem na piru po službi? :-)
Ni mi pa jasno, zakaj INSERTaš tudi id?
Id mora biti auto number, ki ga generira baza.
Tako, da ID pri INSERT izpustiš.
Al jaz nisem dobro prebral ko sem na piru po službi? :-)
Poglej in se nasmej: vicmaher.si
chuck ::
insertam product_id, kar ni ID.
Imam pa novi problemček:
SELECT email FROM oc_order WHERE tracking_no IS NOT NULL
negativno.... order_status_id = 7 'zavrjeno
pozitivno...order_status_id != 7 'ostalo
pozitivno > negativno*3
Izpis mora biti seznam unikatnih emailov. Potrebno lcase in odstraniti space.
V bistvu bi moral grupirati emaile in izpisati samo emaile kjer se email trikrat manjkrat ponovi pri pogoju order_status_id ni 7.
Imam pa novi problemček:
SELECT email FROM oc_order WHERE tracking_no IS NOT NULL
negativno.... order_status_id = 7 'zavrjeno
pozitivno...order_status_id != 7 'ostalo
pozitivno > negativno*3
Izpis mora biti seznam unikatnih emailov. Potrebno lcase in odstraniti space.
V bistvu bi moral grupirati emaile in izpisati samo emaile kjer se email trikrat manjkrat ponovi pri pogoju order_status_id ni 7.
Zgodovina sprememb…
- spremenil: chuck ()
immortan ::
če imaš product_id, ki je primary key (PK), boš mogo za update uporabiti INSERT INTO {mytable} (column1, column2) VALUES(col1value,c2value) ON DUPLICATE KEY update column1=col1value, column2=c2value
immortan ::
tole bo potrebno nested select naresti.
1) dobi vse unikatne emaile z GROUP BY HAVING - ki majo pogoj order_status_id != 7 (inner join) t1 // recmo da je to negativno
2) dobi vse unikatne emaile z GROUP BY HAVING - ki imajo pogoj order_status_id = 7 (inner join) t2 // recmo da je to pozitivno
3) SELECT email,t1.count as negativni,t2.count AS pozitivni WHERE negativnih/pozitivnih >= 3 (npr, če je 30 negativnih, 10 pozitivnih, 30/10 = 3 - je 3x)
lahk pa se poigraš s https://www.w3schools.com/sql/func_mysq... pa boš dobil točno številko kolko je division :)
1) dobi vse unikatne emaile z GROUP BY HAVING - ki majo pogoj order_status_id != 7 (inner join) t1 // recmo da je to negativno
2) dobi vse unikatne emaile z GROUP BY HAVING - ki imajo pogoj order_status_id = 7 (inner join) t2 // recmo da je to pozitivno
3) SELECT email,t1.count as negativni,t2.count AS pozitivni WHERE negativnih/pozitivnih >= 3 (npr, če je 30 negativnih, 10 pozitivnih, 30/10 = 3 - je 3x)
lahk pa se poigraš s https://www.w3schools.com/sql/func_mysq... pa boš dobil točno številko kolko je division :)
Zgodovina sprememb…
- spremenilo: immortan ()
kuall ::
;with zavrnjena_narocila ( select email, cnt = count (email) from oc_order where status = 7 group by email ), valid_narocila ( select email, cnt = count (email) from oc_order where status != 7 group by email ) select v.email from valid_narocila v left join zavrnjena_narocila z on z.email = v.email where isnull (v.cnt, 0) > isnull (z.cnt, 0) * 3 group by v.email
Zgodovina sprememb…
- spremenilo: kuall ()
DamijanD ::
lahko bi tudi z enim selectom in uporabiš case when v select in group delu (case when oc_order.status = 7 then 'zavrnjeno' else 'ok' end)
chuck ::
Hvala, tole je pa bolj zapleteno kot sem si predstavljal.
Kako pa uporabim WITH, meni javi napako
1 errors were found during analysis.
Unrecognized statement type. (near "with" at position 0)
Kako pa uporabim WITH, meni javi napako
1 errors were found during analysis.
Unrecognized statement type. (near "with" at position 0)
kuall ::
samo odstrani ;
jaz programiram v MS SQL tam rabiš ;
lahko da je še kaka napaka, sem spisal iz glave brez testiranja
jaz programiram v MS SQL tam rabiš ;
lahko da je še kaka napaka, sem spisal iz glave brez testiranja
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Pomoč pri izdelavi MySQL poizvedbe... (strani: 1 2 )Oddelek: Programiranje | 5346 (3713) | urli |
» | Kako se lotiti problema z XML uvozomOddelek: Programiranje | 1638 (1020) | chuck |
» | SQL sortiranje JOINOddelek: Programiranje | 1161 (928) | korenje3 |
» | Baza & c#Oddelek: Programiranje | 4156 (3214) | xardas |
» | Prevod pisane besede v "kodo"Oddelek: Programiranje | 1221 (999) | Gundolf |