Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] optymalizacja i problem z zapytaniem
marins
post 29.07.2009, 09:41:00
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 4
Dołączył: 12.07.2003

Ostrzeżenie: (0%)
-----


Witam,

mam kilka rzeczy, które blokują mi pracę nad projektem - otóż:

Optymalizacja:

Tabela kategorii składa się z dwóch kolumn:

  1. `category_parent_id`, `category_child_id`


w niej powiązania kategorii.
jeżeli `category_parent_id` = 0; to jest to kategoria glowna.

w moim sklepie (skrypt joomla) po wygenerowaniu strony znam aktualną kategorię, ale chcę wyciągnąć z powyższej tabeli główną kategorię. Napisałem samo-powtarzającą się funkcję która wykonuje X zapytań. Ale gdy będzie to powiedzmy 10 podkategoria, to będę miał 10 zapytań.

oto przykład:
  1. SELECT * FROM `#__{vm}_category_xref` WHERE category_child_id='69'
  2. SELECT * FROM `#__{vm}_category_xref` WHERE category_child_id='34'

Pytanie 1: Czy jest możliwość zrobienia tego w jednym zapytaniu, tak aby nie było różnicy, czy jest to 10 poziom w drzewku czy np 60(przesadzilem teraz oczywiscie)

Problem z zapytaniem:
Mam nieznaną liczbę tabel o szablonowej nazwie `jos_vm_product_type_#`, gdzie # to nr od 1 do ...
w każdej z nich jest kolumna `product_id`

ilość tabel wyciągam za pomocą:
  1. SELECT `product_type_id` FROM `jos_vm_product_type` ORDER BY `product_type_id` ASC

i za pomocą PHP generuje kolejne złożone zapytanie.

Pytanie 2a: czy da się w jakiś inny sposób określić tabele jaka mają zostać przeszukane nie znając ich ilości, a tylko szablon nazwy bez zapytania o ilość tabel?

chciałbym np znaleźć wartość 106 w tym polu - dana wartość może wystąpić tylko 1 raz (np gdy jest w tabeli_1, to w pozostałych już jej na pewno nie ma). próbowałem zrobić to za pomocą UNION:
  1. (SELECT product_id AS A1 FROM jos_vm_product_type_1 WHERE product_id = '106') UNION
  2. (SELECT product_id AS A2 FROM jos_vm_product_type_2 WHERE product_id = '106') UNION
  3. (SELECT product_id AS A3 FROM jos_vm_product_type_3 WHERE product_id = '106') UNION
  4. (SELECT product_id AS A4 FROM jos_vm_product_type_4 WHERE product_id = '106') UNION
  5. (SELECT product_id AS A5 FROM jos_vm_product_type_5 WHERE product_id = '106') UNION
  6. (SELECT product_id AS A6 FROM jos_vm_product_type_6 WHERE product_id = '106')


ale zostaje zwrócony taki oto wynik:
  1. `A1` = '106'


w taki oto sposób, muszę zdefiniować za pomocą php, czy w polach A1,A2,A3 ... nie wystąpiła jakaś wartość != "".

Pytanie 2b: jak skonstruować zapytanie, które przeszuka mi wszystkie tabele o szablonie nazwy podanym wyżej, przeszuka po polach `product_id` i zwróci mi wynik w postaci `product_id`='106' oraz nazwe/nr tabeli w ktorej wystapila ta wartość.

Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
skowron-line
post 29.07.2009, 09:56:36
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


  1. (SELECT product_id AS A1 FROM jos_vm_product_type_1 WHERE product_id = '106') UNION
  2. (SELECT product_id AS A2 FROM jos_vm_product_type_2 WHERE product_id = '106') UNION
  3. (SELECT product_id AS A3 FROM jos_vm_product_type_3 WHERE product_id = '106') UNION
  4. (SELECT product_id AS A4 FROM jos_vm_product_type_4 WHERE product_id = '106') UNION
  5. (SELECT product_id AS A5 FROM jos_vm_product_type_5 WHERE product_id = '106') UNION
  6. (SELECT product_id AS A6 FROM jos_vm_product_type_6 WHERE product_id = '106')

Może mi się tylko wydaje bo nie jestem wymiataczem SQL no ale tu jak machniesz JOIN i przyłączysz sobie wszystkie tabele do dostaniesz wynik
a1, a2, a3.. i część będzie NULL a część będzie wypełniona bo chyba o to Ci chodzi. No ale niewiem czy dobrze zrozumiałem bo krótko spałem dziś w nocy.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
marins
post 29.07.2009, 10:04:51
Post #3





Grupa: Zarejestrowani
Postów: 47
Pomógł: 4
Dołączył: 12.07.2003

Ostrzeżenie: (0%)
-----


no właśnie chciałbym, aby zwrocona została jedna kolumna `product_id` z wynikiem, a jeszcze lepiej jakby została zwrócona tabela, w której znajduje się ta wartość.

mógłbym oczywiście zrobić tutaj IF (A1 == 106) return 'tabela_1'; etc. ale jednak chcialbym mieć już wyciagnieta nazwe tabeli z zapytani.
Go to the top of the page
+Quote Post
skowron-line
post 29.07.2009, 11:07:23
Post #4





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


smile.gif
  1. (SELECT product_id AS A1, "tabela_1" AS nazwa_tabeli FROM jos_vm_product_type_1 WHERE product_id = '106') UNION
  2. (SELECT product_id AS A2, "tabela_2" AS nazwa_tabeli FROM jos_vm_product_type_2 WHERE product_id = '106') UNION
  3. (SELECT product_id AS A3, "tabela_3" AS nazwa_tabeli FROM jos_vm_product_type_3 WHERE product_id = '106') UNION
  4. (SELECT product_id AS A4, "tabela_4" AS nazwa_tabeli FROM jos_vm_product_type_4 WHERE product_id = '106') UNION
  5. (SELECT product_id AS A5, "tabela_5" AS nazwa_tabeli FROM jos_vm_product_type_5 WHERE product_id = '106') UNION
  6. (SELECT product_id AS A6, "tabela_6" AS nazwa_tabeli FROM jos_vm_product_type_6 WHERE product_id = '106')

wtedy bedziesz mial jaka to tabela w zmiennej nazwa_tabeli


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
marins
post 30.07.2009, 09:43:34
Post #5





Grupa: Zarejestrowani
Postów: 47
Pomógł: 4
Dołączył: 12.07.2003

Ostrzeżenie: (0%)
-----


o - dzięki. jeden problem z głowy. Nie wiedziałem, że jest taka możliwość w mysql. Człowiek uczy się całe życie.
Jeszcze raz dziękuję i muszę ponownie wrócić do źródła (Dokumentacji mysql'a)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 02:48