Maciej
Wróbel
a czy ty masz swój
ręcznik?...
Temat: Problem z warunkami łączenia
Witam.Mam problem z zapytaniem. Niestety muszę wynik otrzymać TYLKO jednym zapytaniem gdyż nie mogę ingerować w kod, tylko zapytanie, nie mam do dyspozycji funkcji ani procedur więc zostaje pojedyncze zapytanie.
Mam go obecnie w takiej formie:
select distinct m.manufacturers_id,
p.products_id,
p.products_image,
p.products_model,
pd.products_name,
pd.products_description,
pd.products_short,
p.products_price,
p.products_tax_class_id,
IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price,
IF(s.status, s.specials_new_products_price, p.products_price) as final_price,
[b]IFNULL((SELECT products_id FROM products_to_products_extra_fields2[/b] WHERE products_to_products_extra_fields2.products_id = 5703),0) AS field2
from
(((((products p) left join products_to_products_extra_fields p2pef on p.products_id=p2pef.products_id)
left join manufacturers m on m.manufacturers_id=p.manufacturers_id)
left join specials s on p.products_id = s.products_id)
left join products_attributes pa on p.products_id = pa.products_id) ,
products_description pd,
categories c,
products_to_categories p2c,
[b]products_extra_fields pef[/b]
[b]inner join products_to_products_extra_fields2 p2e on p2e.products_extra_fields_id = pef.products_extra_fields_id[/b]
where
products_extra_fields_status = 1 and
p2e.products_extra_fields_value<>'' and
p2e.products_id = pd.products_id and
p.products_status = '1' and
c.categories_status = '1' and
p.products_id = pd.products_id and
pd.language_id = '1' and
p.products_id = p2c.products_id and
p2c.categories_id = c.categories_id and (
(pd.products_name like '%olily%'
or pa.options_code like '%olily%'
or pa.options_code like '%ylilo%'
or p.products_model like '%olily%'
or p.products_model like '%ylilo%'
[b]or p2e.products_extra_fields_value like '%olily%' [/b]
or m.manufacturers_name like '%olily%'
or pd.products_description like '%olily%'
OR p.products_id = 5703) )
order by pd.products_name
Elementy które są istotne:
IFNULL((SELECT products_id FROM products_to_products_extra_fields2[/b] WHERE products_to_products_extra_fields2.products_id = 5703),0) AS field2
or p2e.products_extra_fields_value like '%olily%' -> to jest w where
a to w FROM
products_extra_fields pef
inner join products_to_products_extra_fields2 p2e on p2e.products_extra_fields_id = pef.products_extra_fields_id
I teraz o co chodzi - jeśli zmienna którą tworzę sobie warunkiem na górze field2 będzie miała zero zapytanie powinno pominąć dołączanie tablic p2e oraz pef i wszystkiego co z nimi związane.
Próbowałem IF (warunek,inner join...)
Próbowałem IF(warunek then inner join...)
kombinowałem na różne sposoby aby to zapisać i nic nie przychodzi mi do głowy, wujek google także mi nie pomógł a spędziłem ponad godzinę aby coś odnaleźć.
Nie jestem jakimś wymiataczem jeśli chodzi o SQL no i tutaj póki co leżę.
Czy możecie mi powiedzieć czy to jest wykonalne, oraz nakierować jak to powinienem zapisać. Nie oczekuję gotowego rozwiązania, wystarczy wskazówka.
z góry dzięki za odpMaciej Wróbel edytował(a) ten post dnia 03.02.12 o godzinie 12:29
Bartosz W. System Engineer
Temat: Problem z warunkami łączenia
Obiecaj komuś Macieju pieniądze za pomoc w rozwiązaniu problemu, w obietnicach jesteś debeściakiem :)PozdrowieniaBartøsz W. edytował(a) ten post dnia 03.02.12 o godzinie 13:26
Jakub
Panas
Specjalista,
URPL,WMiPB
Temat: Problem z warunkami łączenia
A próbowałeś zapytań rekurencyjnych:- z p2e oraz pef i wszystkiego co z nimi związane wyciągasz to co potrzebujesz (czyli co nie spełnia warunku z field2)
- łączysz z resztą danych
Jak Graeme Birchall napisał w Cookbook do DB2 9: "Zapytania rekurencyjne mogą być bardzo wydajne, jeśli są zakodowane poprawnie i istnieją odpowiednie indeksy. Jeśli oba warunki nie są prawdziwe, to mogą być bardzo wolne"
Jakub
Wojt
Projektant systemów
IT, Team Leader,
Programista .NET C#
Temat: Problem z warunkami łączenia
Nie jestem pewny, ale wydaje mi się że musisz stworzyć dwa oddzielne zapytania:jedno z 'JOIN'ami' i warunkiem WHERE
IFNULL((SELECT products_id FROM products_to_products_extra_fields2 WHERE products_to_products_extra_fields2.products_id = 5703),0) <> 0
drugie bez 'JOIN'ów ' i warunkiem WHERE
IFNULL((SELECT products_id FROM products_to_products_extra_fields2 WHERE products_to_products_extra_fields2.products_id = 5703),0) = 0
a następnie łączyć wyniki za pomocą UNION.
Paweł P. filozof
Temat: Problem z warunkami łączenia
ale krzaki :Dja mam podobny problem
i nie mam pomysłu na rozdzielenie zapytań.
[MySQL]
chciałbym zrobić coś takiego
SELECT COUNT(*) FROM a12000000_78.nazwiska WHERE `nazwisko` LIKE (SELECT wyszukiw FROM `alfabet`).
podzapytanie zwraca więcej niż jeden wiersz odpowiedzi.
Sebastian
Zaborowski
programista /
webmaster /
freelancer
Temat: Problem z warunkami łączenia
Przydałyby się tu Oraclowe kursory. Bez procedury ciężko będzie.
Jarosław Fogt IT Specialist
Temat: Problem z warunkami łączenia
Paweł P.:
ale krzaki :D
ja mam podobny problem
i nie mam pomysłu na rozdzielenie zapytań.
[MySQL]
chciałbym zrobić coś takiego
SELECT COUNT(*) FROM a12000000_78.nazwiska WHERE `nazwisko` LIKE (SELECT wyszukiw FROM `alfabet`).
podzapytanie zwraca więcej niż jeden wiersz odpowiedzi.
Kursor?
Damian
L.
Programista, Asseco
Business Solutions
S.A.
Temat: Problem z warunkami łączenia
Paweł P.:Ja z kolei proponuję zamianę subquery na joina :)
ale krzaki :D
ja mam podobny problem
i nie mam pomysłu na rozdzielenie zapytań.
[MySQL]
chciałbym zrobić coś takiego
SELECT COUNT(*) FROM a12000000_78.nazwiska WHERE `nazwisko` LIKE (SELECT wyszukiw FROM `alfabet`).
podzapytanie zwraca więcej niż jeden wiersz odpowiedzi.
Wiesław
Brodowski
dyrektor,
Info-Centrum sp. z
o.o.
Temat: Problem z warunkami łączenia
Próbowałem IF (warunek,inner join...)Nie analizowałem dokładnie zapytania ale wydaje mi się, że powinno pomóc coś takiego:
Próbowałem IF(warunek then inner join...)
..inner join on cos1=cos2 and warunek
Dla warunek=false nic się nie powinno złączyć.
Jakub
Panas
Specjalista,
URPL,WMiPB
Temat: Problem z warunkami łączenia
Paweł P.:
ale krzaki :D
ja mam podobny problem
i nie mam pomysłu na rozdzielenie zapytań.
[MySQL]
chciałbym zrobić coś takiego
SELECT COUNT(*) FROM a12000000_78.nazwiska WHERE `nazwisko` LIKE (SELECT wyszukiw FROM `alfabet`).
podzapytanie zwraca więcej niż jeden wiersz odpowiedzi.
Jak powiesz co chcesz osiągnąć lub dasz prosty przykład tabelki z oczekiwanym wynikiem to łatwiej będzie Ci pomóc.
Marcin
Miga
Programista. Po
prostu programista.
Temat: Problem z warunkami łączenia
Wiesław Brodowski:Ale Inner Joiny (w odróżnienu od IN) w takim łączeniu mogą powielać rekordy...
Próbowałem IF (warunek,inner join...)Nie analizowałem dokładnie zapytania ale wydaje mi się, że powinno pomóc coś takiego:
Próbowałem IF(warunek then inner join...)
..inner join on cos1=cos2 and warunek
Dla warunek=false nic się nie powinno złączyć.
Przykład:
t1: (z tekstami)
alabama
dakota
ala ma kota
lajki (z LIKE)
ala
kot
SELECT * FROM t1 JOIN lajki ON t1.pole LIKE '%' + lajki.pole + '%'
zwróci 4 rekordy:
alabama, ala
dakota, kot
ala ma kota, ala
ala ma kota, kot
pozdrawiaMM
Paweł P. filozof
Temat: Problem z warunkami łączenia
Jakub Panas:
Jak powiesz co chcesz osiągnąć lub dasz prosty przykład tabelki z oczekiwanym wynikiem to łatwiej będzie Ci pomóc.
Dziękuje, teraz właściwie mnie to interesuje czysto poznawczo :D
zajrzę do tego okropnie dużego manuala od MySQL, jak będę miał wolny czas.
Oczekiwany wynik:
A% > 245
B% > 1536
C% > 970
Ć% > 19
D% > 1050
E% > 43
F% > 493
G% > 1323
H% > 377
I% > 97
J% > 642
K% > 2629
L% > 514
Ł% > 330
M% > 1427
N% > 468
O% > 496
Q% > 0
P% > 1719
R% > 815
S% > 2393
Ś% > 207
T% > 585
U% > 106
V% > 2
W% > 1221
Y% > 0
Z% > 559
Ź% > 0
Ż% > 180
X% > 0
oszukiwałem :p i zrobiem to tak:
[PHP]
for ($i=1;$i<sizeof($_SESSION[alfabet])+1;$i++)
{
$db_tabela=" a12000000_78.nazwiska WHERE `nazwisko` LIKE '".dajlike($i)."'";
fireSQL("SELECT","COUNT",$db_tabela,$nowe);
echo dajlike($i)." > ".$nowe[0][0]."<br>";
}
cel: oszacuj ilość danych z tabeli rozpoczynających się na literę alfabetu.
Paweł P. filozof
Temat: Problem z warunkami łączenia
Bartosz Wąsik:
Można np.
SELECT count(*), substr(nazwisko,1,1) l from a12000000_78.nazwiska
...
CREATE TABLE `zzzzzzy` (
`ile` int(20) unsigned NOT NULL,
`xyz` varchar(5) collate utf8_bin NOT NULL default '',
KEY `xyz` (`ile`,`xyz`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT into zzzzzzy (ile,xyz)
SELECT count(*), substr(nazwisko,1,3) l from a12000000_78.nazwiska
group by l
z tym kluczem to nie jestem pewnien, ale udało się :-)
