Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mysql - duuze zapytanie
Forum PHP.pl > Forum > PHP
pieto
Witam, Ktoś pomoże mi znalesc odp. gdzie jest błąd w zapytaniu ?

  1. <?php
  2. select count(*) as total SELECT c.customers_id id, c.customers_email_address email, c.customers_firstname name, c.customers_lastname lastname, c.customers_telephone telephone, c.customers_fax fax , a.entry_company company, a.entry_street_address street, a.entry_postcode postcode, a.entry_city city , i.customers_info_number_of_logons num_logons, i.customers_info_date_account_created created, i.customers_info_date_of_last_logon last_logon , (SELECT count(*) FROM (orders o) where c.customers_id=o.customers_id) l_zam , (SELECT count(*) FROM (orders_query q) where c.customers_id=q.customer_id) l_zap , (select sum(op.final_price*op.products_quantity) FROM (orders_products op, orders o) where o.orders_id=op.orders_id and c.customers_id=o.customers_id) total_zam , (select sum(oop.customer_price*oop.products_quantity) FROM (orders_query_products oop, orders_query oo) where oo.orders_query_id=oop.orders_query_id and c.customers_id=oo.customer_id) total_zap ,(SELECT SUM(points) FROM (customers_points cs) WHERE status = 1 and c.customers_id=cs.customers_id) total_points , -least(c.customers_discount, cg.customers_groups_discount) rabat FROM (customers c, address_book a) LEFT OUTER JOIN customers_info i on (c.customers_id=i.customers_info_id) LEFT OUTER JOIN customers_groups cg on (c.customers_groups_id=cg.customers_groups_id) where a.address_book_id=c.customers_default_address_id AND c.customers_validation=1 AND c.customers_status=1 AND c.internal_use=0 ORDER BY id
  3. ?>


Zapytanie działa bez "select count(*) as total " - na pocztku zapytania
problem w tym ze musi to pozostać bo narzuca to funkcja do stronicowania wynikow
zimi
spróbuj wstawić przecinek po total i wywalić ten select za total
Cytat
problem w tym ze musi to pozostać bo narzuca to funkcja do stronicowania wynikow

no to mam dziwne wrażenie że to jest zła funkcja...
jak to zapytanie będzie ładnie chodzić i nie zabije Ci serwa to respect...
na moje to powinieneś mieć inną strukturę danych
franki01
2x SELECT w jednym zapytaniu? Pierwszy raz widze takie cos biggrin.gif

A nie lepiej zrobic zapytanie bez
Kod
select count(*) as total

na poczatku, a potem $num = mysql_num_rows($result); zeby zdobyc ilosc rekordow?

  1. <?php
  2. $query = "SELECT ....";  // tutaj zapytanie bez "select count(*) as total" na poczatku
  3. $result = mysql_query($query);
  4. $num = mysql_num_rows($result);
  5. ?>



Potem w $num masz ilosc rekordow. To samo co chciales zrobic, tyle ze bez kombinowania
pieto
wykopalem drugie selecta i dostaję:

#1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Ogolnie zapytaine smiga ze az milo, szkoda tylko ze stronnicowanie nie dziala,

apropo stronicoania funckcja na bank pewna - oryginalna z oscommerca, przechodzi przez nią duzo roznych zapytan i nie bylo dotychczas problemow..
Sedziwoj
Może zmieniła się baza danych, MySQL miał w zwyczaju pozwalać używania funkcji grupujących bez GROUP BY...
Ogólnie to są i tak zapytania, więc raz robisz
  1. SELECT count(*) AS total FROM (customers c, address_book a) LEFT OUTER JOIN customers_info i ON (c.customers_id=i.customers_info_id) LEFT OUTER JOIN customers_groups cg ON (c.customers_groups_id=cg.customers_groups_id) WHERE a.address_book_id=c.customers_default_address_id AND c.customers_validation=1 AND c.customers_status=1 AND c.internal_use=0

a potem
  1. SELECT c.customers_id id, c.customers_email_address email, c.customers_firstname name, c.customers_lastname lastname, c.customers_telephone telephone, c.customers_fax fax , a.entry_company company, a.entry_street_address street, a.entry_postcode postcode, a.entry_city city , i.customers_info_number_of_logons num_logons, i.customers_info_date_account_created created, i.customers_info_date_of_last_logon last_logon , (SELECT count(*) FROM (orders o) WHERE c.customers_id=o.customers_id) l_zam , (SELECT count(*) FROM (orders_query q) WHERE c.customers_id=q.customer_id) l_zap , (SELECT sum(op.final_price*op.products_quantity) FROM (orders_products op, orders o) WHERE o.orders_id=op.orders_id AND c.customers_id=o.customers_id) total_zam , (SELECT sum(oop.customer_price*oop.products_quantity) FROM (orders_query_products oop, orders_query oo) WHERE oo.orders_query_id=oop.orders_query_id AND c.customers_id=oo.customer_id) total_zap ,(SELECT SUM(points) FROM (customers_points cs) WHERE STATUS = 1 AND c.customers_id=cs.customers_id) total_points , -least(c.customers_discount, cg.customers_groups_discount) rabat FROM (customers c, address_book a) LEFT OUTER JOIN customers_info i ON (c.customers_id=i.customers_info_id) LEFT OUTER JOIN customers_groups cg ON (c.customers_groups_id=cg.customers_groups_id) WHERE a.address_book_id=c.customers_default_address_id AND c.customers_validation=1 AND c.customers_status=1 AND c.internal_use=0 ORDER BY id


Ale do tego dodając LIMIT, bo bez sensu pobierać wszystkie dane jak masz wyświetlić tylko część.

P.S. Oczywiście nie sprawdzałem poprawności całych zapytań....
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.