[MYSQL] Zapytanie do bazy danych

Nie mogę poradzić sobie z zapytaniem do bazy danych. Chce dołączyć do istniejącej już zmiennej z tabelą kolejną kolumnę o nazwie “kategorie”. Wygląda to tak: mam ID produktu z opisami w jednej tabeli “produkty”, później mam tabele “produkty do kategorii” gdzie znajdują się ID produktów przypisane do ID kategorii i ostatnią tabele “kategorie” gdzie są ID kategorii i przypisane im nazwy.

W skrócie chcę zrobić żeby w jednym wierszu było ID produktu, Opis, Nazwa kategori. Gubię się w tym przez tabele “produkty do kategorii”. HLP? ![-o<

$tpd='products_description';

$tp='products';

$pc='products_to_categories';

$cd='categories_description';



[code]$TabProdukty = $Baza-Take_name("SELECT $cd.categories_name as kategorie, $tp.products_image_lrg as obrazek, $tpd.products_description as opis, $tp.products_id as id_towar, $tpd.products_name as nazwa, $tp.products_price as cena

FROM $tp

INNER JOIN $tpd ON $tp.products_id=$tpd.products_id

INNER JOIN $cd ON $pc.categories_id=$cd.categories_id

LEFT JOIN $ts ON $tp.products_id=$ts.products_id AND status=1

WHERE $tp.products_status=1");


$Baza-Logoff();

ja się zastanawiam, czy to ma sens. Powiedz mi, jeden produkt może należeć do jednej kategorii czy do kilku?

Do kilku.

Mam nadzieję, że skumasz :slight_smile: jakby co, krzycz, czego nie rozumiesz:)

dla jasności:

Tabela ‘produkty_do_kategorii’ powinna mieć strukturę:

produkty_idProdukty | kategorie_idKategorie

w polu ‘produkty_idProdukty’ zapisujesz id produktu, a w ‘kategorie_idKategorie’ id kategorii. i zapytanie wygląda tak:

SELECT 

idProdukty, nazwa, opis, kategoria


FROM 

produkty, kategorie, produkty_do_kategorii 


WHERE 

produkty_do_kategorii.produkty_idProdukty=produkty.idProdukty 

AND 

produkty_do_kategorii.kategorie_idKategorie=kategorie.idKategorie

powinno działać :slight_smile:

Jeśli dobrze zrozumiałem chodzi Ci o to żeby nazwy kategori znajdywały się w tabeli “produkty_do_kategorii”? Co odpada bo wymagało by zbyt dużych modyfikacji w istniejącym kodzie. Może pomoże gdy podam dokładną strukturę tabel:

CREATE TABLE IF NOT EXISTS `categories` (

  `categories_id` int(11) NOT NULL auto_increment,

  `categories_image` varchar(64) default NULL,

  `parent_id` int(11) NOT NULL default '0',

  `sort_order` int(3) default NULL,

  `date_added` datetime default NULL,

  `last_modified` datetime default NULL,

  PRIMARY KEY (`categories_id`),

  KEY `idx_categories_parent_id` (`parent_id`),

  KEY `sort_order` (`sort_order`)

) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=137 ;


CREATE TABLE IF NOT EXISTS `categories_description` (

  `categories_id` int(11) NOT NULL default '0',

  `language_id` int(11) NOT NULL default '1',

  `categories_name` varchar(64) NOT NULL,

  `categories_heading_title` varchar(64) default NULL,

  `categories_description` text,

  PRIMARY KEY (`categories_id`,`language_id`),

  KEY `idx_categories_name` (`categories_name`)

) ENGINE=MyISAM DEFAULT CHARSET=latin2;


CREATE TABLE IF NOT EXISTS `products` (

  `products_id` int(11) NOT NULL auto_increment,

  `products_quantity` int(4) NOT NULL default '0',

  `products_model` varchar(12) default NULL,

  `products_image` varchar(64) default NULL,

  `products_image_med` varchar(64) default NULL,

  `products_image_lrg` varchar(64) default NULL,

  `products_image_sm_1` varchar(64) default NULL,

  `products_image_xl_1` varchar(64) default NULL,

  `products_image_sm_2` varchar(64) default NULL,

  `products_image_xl_2` varchar(64) default NULL,

  `products_image_sm_3` varchar(64) default NULL,

  `products_image_xl_3` varchar(64) default NULL,

  `products_image_sm_4` varchar(64) default NULL,

  `products_image_xl_4` varchar(64) default NULL,

  `products_image_sm_5` varchar(64) default NULL,

  `products_image_xl_5` varchar(64) default NULL,

  `products_image_sm_6` varchar(64) default NULL,

  `products_image_xl_6` varchar(64) default NULL,

  `products_price` decimal(15,4) NOT NULL default '0.0000',

  `products_date_added` datetime NOT NULL default '0000-00-00 00:00:00',

  `products_last_modified` datetime default NULL,

  `products_date_available` datetime default NULL,

  `products_weight` decimal(5,2) NOT NULL default '0.00',

  `products_status` tinyint(1) NOT NULL default '0',

  `products_tax_class_id` int(11) NOT NULL default '0',

  `manufacturers_id` int(11) default NULL,

  `products_ordered` int(11) NOT NULL default '0',

  `products_availability_id` varchar(255) default NULL,

  PRIMARY KEY (`products_id`),

  KEY `idx_products_date_added` (`products_date_added`),

  KEY `products_model` (`products_model`),

  KEY `products_price` (`products_price`),

  KEY `products_date_available` (`products_date_available`),

  KEY `manufacturers_id` (`manufacturers_id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=1429 ;


CREATE TABLE IF NOT EXISTS `products_description` (

  `products_id` int(11) NOT NULL auto_increment,

  `language_id` int(11) NOT NULL default '1',

  `products_name` varchar(64) NOT NULL,

  `products_shortdescription` text,

  `products_description` text,

  `products_url` varchar(255) default NULL,

  `products_viewed` int(5) default '0',

  PRIMARY KEY (`products_id`,`language_id`),

  KEY `products_name` (`products_name`)

) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=1429 ;


CREATE TABLE IF NOT EXISTS `products_to_categories` (

  `products_id` int(11) NOT NULL default '0',

  `categories_id` int(11) NOT NULL default '0',

  PRIMARY KEY (`products_id`,`categories_id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin2;

aboslutnie nie :slight_smile: tylko id produktu i id kategorii w jednej tabeli:) ważnym jest, aby ogólnie baza danych zbudowana była tak, aby jak najmniej pól się powtarzało, a zastąpić to relacjami:)

już spoglądam na Twoją strukturę bazy…

proszę:

SELECT

products_description.products_id, products_name, products_description, categories_description


FROM

categories_description, products_description, products_to_categories


WHERE

products_to_categories.products_id=products_description.products_id

AND

products_to_categories.categories_id=categories_description.categories_id

No teraz skrypt nie zwraca błędu ale nazw kategorii i tak nie wyświetla. :roll: Do tego produkty na liście się powtarzają.

jak to nie? ja uzupełniłem na szybko tabele, wklepałem zapytanie i oto rezultat

mysql.jpg

działa, jak należy

sqlkc.jpg

oj…

pokaż mi Twoją uzupełnioną tabele: ‘products_to_categories’…

poza tym nie zapisuj do tabeli ciągów

  • jest to mega zasobożerne, a załatwić to można wiele łatwiej i przyjemniej.

Problem z niewyświetlaniem sie kategori rozwiązałem, pozostają jeszcze dublowane wpisy.

e7xi8p.jpg

To nie zależy odemnie ja tych wpisów nie uzupełniam.

ale jakim dublowaniem wpisów? ja nie widzę tutaj dubli :slight_smile:

Np: pokazuje 10 identycznych par spodni o tym samym id.

a to już wina zaprojektowanej bazy.

bo jak masz tabele produkty, to nie wpisuj w nazwie: Spodnie męskie Ventura… itd.

Tylko tabela powinna wyglądać tak: Nazwa: Ventura, Kategoria: Spodnie (bądź id do kategorii spodnie z tabeli categories), Rozmiar: …, Płeć: kobieta/mężczyzna, itd. Potem odpowiednie powiązania i po problemie :slight_smile:

Poza tym, jak dany produkt pasuje do kilku kategorii, to w tabeli ‘products_to_categories’ siłą rzeczy id produktu musi się powtórzyć, nie da się inaczej :slight_smile:

Ja rozumiem, ale nie ja tą baze projektowałem i jako sklep to funkcionuje normalnie więc napewno jakoś idzie to wyciagnąć w sposób pojedynczy.