Συνδυαστικά φίλτρα eshop

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Συνδυαστικά φίλτρα eshop

Δημοσίευση από kapoios001 » 07 Μάιος 2011 20:24

jpk έγραψε:Μπορεί να είναι άσχετο μπορεί και όχι … το ξαναρώτησα πριν μέρες … Πέρα από αυτό μια ερώτηση ggirtsou , που νομίζω θα βοηθήσει, όταν κάνεις var_dump τα $criteria ακριβώς πριν το query έχει μέσα του τα «φίλτρα» που περιμένεις σωστά κάθε φορά;

Κώδικας: Επιλογή όλων

array(2) { [0]=> string(1) "2" [1]=> string(2) "12" } 
Ναι, γιατί;

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Συνδυαστικά φίλτρα eshop

Δημοσίευση από jpk » 08 Μάιος 2011 10:45

Μήπως ήταν εκεί το λάθος επειδή δεν είχες δείξει πως πραγματικά το γεμίζεις, αλλά δεν είναι...

Να μην σε κουράζω, τον είδα τον κώδικά σου και δεν καταλαβαίνω λάθος σχετικά με αυτόν και το query, ελπίζω να μπορεί να βοηθήσει κάποιος άλλος....

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Συνδυαστικά φίλτρα eshop

Δημοσίευση από dva_dev » 08 Μάιος 2011 13:57

ggirtsou έγραψε:

Κώδικας: Επιλογή όλων

...
	$sql .= "group by pf.product_id
    having COUNT(pf.filter_ID)=2
)tmp
...
To having COUNT(pf.filter_ID)=2 μην το αφήνεις καρφωτό

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Συνδυαστικά φίλτρα eshop

Δημοσίευση από kapoios001 » 09 Μάιος 2011 13:29

Τι εννοείς μην το αφήνω καρφωτό; Να το σβήσω το COUNT(pf.filter_ID)=2;

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Συνδυαστικά φίλτρα eshop

Δημοσίευση από cherouvim » 09 Μάιος 2011 13:33

ggirtsou έγραψε:Τι εννοείς μην το αφήνω καρφωτό; Να το σβήσω το COUNT(pf.filter_ID)=2;
Έχεις το 2 καρφωτό (ή αλλιώς hardcoded) ενώ είπαμε:
το >=3 είναι το πλήθος των φίλτρων που έχεις στο in.

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Συνδυαστικά φίλτρα eshop

Δημοσίευση από kapoios001 » 09 Μάιος 2011 13:39

Ωραία δουλεύει πιο σωστά τώρα.

Απλώς ένα μικρό πράγμα ακόμα: Όταν επιλέγω το φίλτρο "256 ΜΒ" μου εμφανίζει μετά σαν φίλτρο μόνο το "Turbo-X" ενώ θα έπρεπε να εμφανίζει και το "Για απλή Χρήση" και το "15 έως 16 inches".

Αυτό το λέω επειδή 2 προϊόντα ανήκουν στα παραπάνω φίλτρα (αλλά εμφανίζει μόνο το Turbo-X).

Ευχαριστώ πάρα πολύ για τη βοήθεια.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Συνδυαστικά φίλτρα eshop

Δημοσίευση από dva_dev » 09 Μάιος 2011 18:02

Βάλε κάπου να τυπώνει το query που φτιάχνεται και εκτελείται και δείξτο μας.
Λογικά αν έχεις επιλέξει μόνο το φίλτρο 19 (Κάρτα γραφικών 256ΜΒ) θα πρέπει να παίρνεις τα εξής αποτελέσματα:

To query κάπως έτσι

Κώδικας: Επιλογή όλων

select pf.filter_ID, COUNT(pf.product_ID) countProducts
from products_filters pf
inner join
(
    select pf.product_id, count(pf.filter_ID) countFilters from
    products p
    inner join products_filters pf on (pf.product_id=p.product_id)
    where pf.filter_ID in (19)
    and p.quantity > 0
    group by pf.product_id
    having count(pf.filter_ID)=1
)tmp
on pf.product_id = tmp.product_id
group by pf.filter_ID
Και τα αποτελέσματα

Κώδικας: Επιλογή όλων

Φίλτρο, Αποτελέσματα
2       1
8       2
12      2
14      1
19      2

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Συνδυαστικά φίλτρα eshop

Δημοσίευση από kapoios001 » 09 Μάιος 2011 19:03

Παιδιά το έψαξα λίγο καλύτερα, και είδα ότι είχα ξεχάσει να κάνω ένα loop όταν έπαιρνα τα αποτελέσματα των φίλτρων. Για να μην σας ζαλίζω να σας πω ότι το πρόβλημά μου λύθηκε χάρη στην βοήθειά σας και ορίστε το function.

Κώδικας: Επιλογή όλων

function ProductsFiltersLink($filter_ID, $filtering) {
	$filtering_sql = $criteria = array();
	if (!empty($filtering)) {
		foreach($filtering as $filteringID) {
			$criteria[] = $filteringID;
		}

$sql = "select pf.filter_ID, COUNT(pf.product_ID) countProducts
from products_filters pf
inner join
(
    select pf.product_id, COUNT(pf.filter_ID) countFilters from
    products p
    INNER JOIN products_filters pf ON (pf.product_id=p.product_id)\n";
	if (!empty($criteria)) {
		$sql .= "where pf.filter_ID in (".implode(', ', $criteria).")\n";
	}

	if (empty($criteria)) {
		$sql .= " WHERE p.quantity > 0\n";
	}
	else {
	    $sql .= "AND p.quantity > 0\n";
	}

	$sql .= "group by pf.product_id
    having COUNT(pf.filter_ID)>=".count($criteria)."
)tmp
on pf.product_id = tmp.product_id
GROUP BY pf.filter_ID";

	}
	else {
		$sql = "select p.product_id from
			  products p, filters f, products_filters pf\n";
		if (!empty($criteria)) {
			$sql .=	"WHERE pf.product_id=p.product_id and pf.filter_id=f.filter_id and
	  pf.filter_ID in (".implode(', ',$criteria).")\n";
		}

		$sql .= "group by p.product_id having count(*)>=".count($criteria)."\n";
	}

	if ( ! ( $result = mysql_query($sql) ) ) {
		front_error('Could not execute MySQL query.');
	}

	$rows = mysql_num_rows($result);
	if ($rows == 0) {
		return '0';
	}
	else {
		if (!empty($filtering)) {
                        // auto to while eixa ksexasei
			while($row = mysql_fetch_array($result)) {
				if ($row['filter_ID'] == $filter_ID) {
					return $row['countProducts'];
				}
			}
		}
		else {
			return $rows;
		}
	}
}

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 2 επισκέπτες