Autor Zpráva
bredis
Profil
Ahoj,

potřebuju poradit s následujícím výpisem:
SELECT s_contact_email
FROM `oc_t_item`
WHERE pk_i_id
IN (

SELECT pk_i_id
FROM `oc_t_item`
UNION SELECT fk_i_item_id
FROM `oc_t_item_custom_attr_values`
WHERE s_value
IN (

SELECT s_value
FROM `oc_t_item_custom_attr_values`
WHERE DATE_FORMAT( s_value, '%Y-%m-%e' ) = CURRENT_DATE( )
)
)

Jde mi o to, aby to vypsalo pouze email s aktuálním datem. Teď to vypíše všechny emaily a na poslední podmínku to vůbec neraeguje.
Co tam mám špatně?
Díky
Kajman
Profil
Vypisujete data pouze ze dvou tabulek, ne ze tří.

Zkusil bych vyhodit část
SELECT pk_i_id
FROM `oc_t_item`
UNION
Podmínka where totiž patří jen ke druhému selectu v unionu. Navíc druhý in je zbytečně složitý, podmínku na datum můžete dát rovnou do prvního in. Vzhledem k rychlosti není vhodné používat date_format ve where (nevyužije se případný index) a current_date znemožní použít sql cache (datum je tedy lepší vygenerovat např. v php).

SELECT s_contact_email
FROM   `oc_t_item`
WHERE  pk_i_id IN (SELECT fk_i_item_id
                   FROM   `oc_t_item_custom_attr_values`
                   WHERE  s_value BETWEEN '2013-09-22 00:00:00' AND '2013-09-22 23:59:59') 

A někdy je v mysql lepší přepsat dotaz na join místo "in (select)", v kterém plánovač občas volí neoptimální procházení.
bredis
Profil
A jo ...máte pravdu je to ze dvou tabulek...nějak jsem se do toho zamotal.

Abych vysvětlil o co mi jde:
1) mám tabulku "oc_t_item" a z ní potřebuju dostat email (s_contact_email) na uživatele
2) v druhý tabulce `oc_t_item_custom_attr_values` je sloupec s_value kde uživatel zadává datum
3) jediný schodný prvek pro obě tabulky je pk_i_id v první tabulce a fk_i_item_id v druhé tabulce.
4) potřebuju dostat ten email který má aktuální den ve sloupci s_value

Snad je to truchu srozumitelný....už se v tom nějak motám:)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: