» »

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
  • 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

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 ::

Hvala, rešil :)

chuck ::

Tega pa ne znam izpeljati, izpis SQL stavka:
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...)

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.

link_up ::

primary ponavadi generiras. Potem pa pac uporabi update.
In and Out

bemfa ::

SELECT DISTINCT

chuck ::

bemfa je izjavil:

SELECT DISTINCT

Hvala ponovno :)

Ahim ::

chuck je izjavil:

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?

chuck ::

SELECT DISTINCT je bila boljša rešitev po mojem

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? :-)
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.

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 :)

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)

kuall ::

samo odstrani ;
jaz programiram v MS SQL tam rabiš ;

lahko da je še kaka napaka, sem spisal iz glave brez testiranja


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Pomoč pri izdelavi MySQL poizvedbe... (strani: 1 2 )

Oddelek: Programiranje
605369 (3736) urli
»

Kako se lotiti problema z XML uvozom

Oddelek: Programiranje
151651 (1033) chuck
»

SQL sortiranje JOIN

Oddelek: Programiranje
171162 (929) korenje3
»

Baza & c#

Oddelek: Programiranje
214157 (3215) xardas
»

Prevod pisane besede v "kodo"

Oddelek: Programiranje
51221 (999) Gundolf

Več podobnih tem