Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Μια ερωτηση
εχω αυτο το sql query

SELECT c.id, c.title, step2, (SELECT count(*) FROM products AS p WHERE
p.step3_id LIKE '%;c.id;%' AND p.enabled='1'
) AS count FROM pro_step3
AS c WHERE c.enabled = '1' ORDER BY c.order_num

αλλα το count που ζηταω μου το φερνει 0 ενω κανονικα θα επρεπε να δουλευει και να φερνει διαφορα αποτελεσματα

 

υπαρχει καμια λυση ??

Δημοσ.

Ψάξε για nested queries, η παρένθεση θα μπει μετα το in στη σύνταξη του ερωτήματος σου. Δε ξέρω και το σχήμα της βάσης σου οπότε..θα πρέπει να το διορθώσεις λίγο.

Δημοσ.

Αν περιμένεις ότι το %;c.id;% θα αντικαθίσταται με την τιμή του c.id από το εξωτερικό query, δεν πρόκειται.

 

Αυτό που πας να κάνεις στην SQL γίνεται με joins, κάτι που έχει τελείως διαφορετική λογική απ' αυτό που έφερες στο μυαλό σου. Google it.

Δημοσ.
-- products --

 

CREATE TABLE IF NOT EXISTS `products` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `step1_id` int(11) NOT NULL,

  `step2_id` int(11) NOT NULL,

  `step3_id` text COLLATE utf8_unicode_ci NOT NULL,

  `title_el` varchar(50) COLLATE utf8_unicode_ci NOT NULL,

  `order_num` int(11) NOT NULL,

  `enabled` tinyint(4) NOT NULL

  PRIMARY KEY (`id`),

  KEY `step1_id` (`step1_id`),

  KEY `step2_id` (`step2_id`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

 

INSERT INTO `products` (`id`, `step1_id`, `step2_id`, `step3_id`, `title_el`, `order_num`, `enabled`) VALUES

(187, 2, 5, ';5;6;', 'SWATS', 1, 1),

 

-- pro_step3 --

 

CREATE TABLE IF NOT EXISTS `pro_step3` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `step2` int(11) NOT NULL,

  `title_el` varchar(50) COLLATE utf8_unicode_ci NOT NULL,

  `order_num` int(11) NOT NULL,

  `enabled` tinyint(4) NOT NULL,

  PRIMARY KEY (`id`),

  KEY `step2` (`step2`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

 

 

SELECT c.id, c.title_el AS title, c.step2, p.count(*) AS count

FROM pro_step3 AS c, products AS p

WHERE c.enabled = '1' AND p.step3_id LIKE '%;c.id;%'

ORDER BY c.order_num

 

Βεβαια αυτο δε δουλευει 

Εγω θελω να διαβασω απο τη βαση τις κατηγοριες (step3) και να εμφανισω ποσα προιοντα εχει η καθε μια

αλλα ενα προιον μπορει να ανοικει σε 2 κατηγοριες
Δημοσ.

Η βάση σου έχει λάθος σχήμα γι' αυτό που αντιπροσωπεύει. Ψάξε να δεις πώς υλοποιούνται many-to-many (1 προϊόν μπορεί να είναι σε πολλές κατηγορίες και 1 κατηγορία έχει πολλά προϊόντα) σχέσεις σε SQL, π.χ. δες εδώ.

 

Επίσης κι αυτό που κάνεις με τα step1, step2, step3 δεν είναι ορθόδοξο -- δεν ξέρω αν έχει φτάσει ή αν θα φτάσει κάποτε να βγει στην επιφάνεια σαν πρόβλημα, αλλά σίγουρα δεν είναι για καλό.

Δημοσ.

γιατι εχει λαθος ? τα step1, step2 step3 ειναι η κατηγορια, υποκατηγορια και υπουποκατηγορια και εχω και step4 που ειναι υπουπουποκατηγορια γιαυτο τα ειπα ετσι

"(1 προϊόν μπορεί να είναι σε πολλές κατηγορίες και 1 κατηγορία έχει πολλά προϊόντα)"

τωρα ενα προιον μπορει να ανηκει σε μια κτηγορια (step1) σε μια υποκατηγορια (step2) αλλα σε 2 η οσες θελει υπουποκατηγοριες step3

Δημοσ.

γιατι εχει λαθος ? τα step1, step2 step3 ειναι η κατηγορια, υποκατηγορια και υπουποκατηγορια και εχω και step4 που ειναι υπουπουποκατηγορια γιαυτο τα ειπα ετσι

"(1 προϊόν μπορεί να είναι σε πολλές κατηγορίες και 1 κατηγορία έχει πολλά προϊόντα)"

τωρα ενα προιον μπορει να ανηκει σε μια κτηγορια (step1) σε μια υποκατηγορια (step2) αλλα σε 2 η οσες θελει υπουποκατηγοριες step3

 

Ναί όλα αυτά είναι κατανοητά μετά από το σχήμα της βάσης που έκανες post. Λάθος έχει γιατί... έτσι  :). Δεν είμαι σίγουρος αν μπορώ να σου εξηγήσω, σου λείπουν απαραίτητες πληροφορίες οι οποίες παίρνονται με διάβασμα. Το μόνο σίγουρο είναι πως αν δεν υλοποιήσεις τη σχέση προϊόντων-κατηγοριών όπως πρέπει τότε αυτό που θέλεις γίνεται με πολύ περισσότερο κόπο ή απλά δεν γίνεται.

 

Για τη δομή των κατηγοριών: όταν έχεις μια ιεραρχική δομή (όπως αυτή με τις κατηγορίες) αυτή συνήθως υλοποιείται είτε με adjacency lists είτε με nested sets, μπορείς να διαβάσεις περισσότερα εδώ. Αυτό που κάνεις είναι η προφανής προσέγγιση κάποιου που χωρίς να έχει διαβάσει σκέφτηκε τον απλούστερο τρόπο να το κάνει. Δεν πρέπει να σε εκπλήσσει αν ακούσεις ότι είναι και ο χειρότερος (βέβαια αν σου δουλεύει ως έχει τον αφήνεις κι όπως είναι, δική σου απόφαση).

 

Για τη σχέση προϊόντων-κατηγοριών θα πρέπει σίγουρα να το κάνεις με ένα επιπλέον table, όπως περιγράφεται στο link που έδωσα νωρίτερα. Αν δεν το κάνεις αυτό τότε καλή τύχη και να ξέρεις ότι θα χτυπάς τοίχους κάθε τόσο όταν θα θέλεις να πάρεις στατιστικά για κάθε κατηγορία επιπέδου 3.

 

Μια επιπλέον περιπλοκή εδώ είναι πως τα δύο παραπάνω θέματα σχετίζονται λίγο: δεδομένου ότι έκανες σωστά τη σχέση κατηγοριών/προϊοντων, αν κάνεις ταυτόχρονα και μια καλύτερη λύση για τις κατηγορίες τότε αυτομάτως και χωρίς περισσότερο κόπο αποκτάς τη δυνατότητα να εντάξεις όποιο προϊόν θέλεις σε όσες κατηγορίες θέλεις ανεξαρτήτως επιπέδου. Αν δεν κάνεις το δεύτερο και αργότερα θελήσεις να εντάξεις προϊόντα σε πολλές κατηγορίες επιπέδου != 3 τότε πάλι θα αρχίσει το σχήμα της βάσης να εκφυλίζεται.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...