Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] optymalizacja i problem z zapytaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
marins
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
skowron-line
  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.
marins
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.
skowron-line
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
marins
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)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.