Maciej W.

Maciej W. 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

konto usunięte

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

Jakub Panas Konsultant
techniczny,
IPR-Insights

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"

konto usunięte

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.

Temat: Problem z warunkami łączenia

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.

konto usunięte

Temat: Problem z warunkami łączenia

Przydałyby się tu Oraclowe kursory. Bez procedury ciężko będzie.

konto usunięte

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.

Damian L. Architekt IT

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.
Ja z kolei proponuję zamianę subquery na joina :)
Wiesław Brodowski

Wiesław Brodowski dyrektor,
Info-Centrum sp. z
o.o.

Temat: Problem z warunkami łączenia

Próbowałem IF (warunek,inner join...)
Próbowałem IF(warunek then inner join...)
Nie analizowałem dokładnie zapytania ale wydaje mi się, że powinno pomóc coś takiego:
..inner join on cos1=cos2 and warunek

Dla warunek=false nic się nie powinno złączyć.
Jakub Panas

Jakub Panas Konsultant
techniczny,
IPR-Insights

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

Marcin Miga Programista. Po
prostu programista.

Temat: Problem z warunkami łączenia

Wiesław Brodowski:
Próbowałem IF (warunek,inner join...)
Próbowałem IF(warunek then inner join...)
Nie analizowałem dokładnie zapytania ale wydaje mi się, że powinno pomóc coś takiego:
..inner join on cos1=cos2 and warunek

Dla warunek=false nic się nie powinno złączyć.
Ale Inner Joiny (w odróżnienu od IN) w takim łączeniu mogą powielać rekordy...
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

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.
Bartosz Wąsik

Bartosz Wąsik Administrator, Pekao

Temat: Problem z warunkami łączenia

Paweł P.:
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++)[/quote]> {[quote] $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.

Można np.

SELECT count(*), substr(nazwisko,1,1) l from a12000000_78.nazwiska
where substr(nazwisko,1,1) in (SELECT wyszukiw FROM `alfabet`)
group by l

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

Następna dyskusja:

Dziwny problem w funkcji T-...




Wyślij zaproszenie do