Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie - art, tag, kategoria
Forum PHP.pl > Forum > Bazy danych > MySQL
LonelyKnight
Hej,

Może mi ktoś pomóc w ułożeniu zapytania, który wybiera artykuł, jego tagi i kategorie w jakich jest dodany?

BD:

arts - id, tytuł, treść
categories - id, nazwa kategorii
tags - id, tag

art2cat - złączeniowa ID art do ID kategorii
art2tag - złączeniowa ID art do ID tagów

i teraz chce wybrać np. 10 artów + kategorie i tagi tych artów - jednym zapytaniem najlepiej ;-) Jeden art może mieć wiele tagów i wiele kategorii.
skowron-line
Cytat(LonelyKnight @ 29.10.2009, 13:05:12 ) *
arts - id, tytuł, treść
categories - id, nazwa kategorii
tags - id, tag

art2cat - złączeniowa ID art do ID kategorii
art2tag - złączeniowa ID art do ID tagów

To są tabele ? bo średnio rozumiem ten zapis.
LonelyKnight
  1.  
  2. --
  3. -- Struktura tabeli dla `art2cat`
  4. --
  5.  
  6. CREATE TABLE IF NOT EXISTS `art2cat` (
  7. `artID` int(10) UNSIGNED NOT NULL,
  8. `catID` mediumint(8) UNSIGNED NOT NULL,
  9. KEY `artID` (`artID`),
  10. KEY `catID` (`catID`)
  11. ) ENGINE=MyISAM;
  12.  
  13. -- --------------------------------------------------------
  14.  
  15. --
  16. -- Struktura tabeli dla `art2tag`
  17. --
  18.  
  19. CREATE TABLE IF NOT EXISTS `art2tag` (
  20. `artID` int(10) UNSIGNED NOT NULL,
  21. `tagID` int(10) UNSIGNED NOT NULL,
  22. KEY `artID` (`artID`,`tagID`)
  23. ) ENGINE=MyISAM;
  24.  
  25. -- --------------------------------------------------------
  26.  
  27. --
  28. -- Struktura tabeli dla `arts`
  29. --
  30.  
  31. CREATE TABLE IF NOT EXISTS `arts` (
  32. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  33. `ownerID` int(10) UNSIGNED NOT NULL,
  34. `title` varchar(200) NOT NULL,
  35. `art` longtext NOT NULL,
  36. `published` tinyint(1) NOT NULL,
  37. `add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  38. `add_ip` varchar(15) NOT NULL,
  39. PRIMARY KEY (`id`),
  40. KEY `ownerID` (`ownerID`)
  41. ) ENGINE=MyISAM;
  42.  
  43. -- --------------------------------------------------------
  44.  
  45. --
  46. -- Struktura tabeli dla `categories`
  47. --
  48.  
  49. CREATE TABLE IF NOT EXISTS `categories` (
  50. `id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
  51. `category` varchar(100) NOT NULL,
  52. PRIMARY KEY (`id`),
  53. KEY `artID` (`category`)
  54. ) ENGINE=MyISAM;
  55.  
  56. -- --------------------------------------------------------
  57.  
  58. --
  59. -- Struktura tabeli dla `tags`
  60. --
  61.  
  62. CREATE TABLE IF NOT EXISTS `tags` (
  63. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  64. `tag` varchar(25) NOT NULL,
  65. PRIMARY KEY (`id`),
  66. UNIQUE KEY `tag` (`tag`)
  67. ) ENGINE=MyISAM;
  68.  


Zrobiłem to na 3 zapytaniach ale jakby ktoś miał pomysł jak wybrać te rekordy jednym to byłbym wdzięczny.
thek
Taka struktura tabel jaką masz miesza i jednym zapytaniem to łączyć jest po prostu bezsensowne, bo stracisz wiele informacji jeśli z tym chcesz coś więcej robić dalej. O ile są Ci potrzebne tylko same nazwy to możesz użyć group_concat, ale jeśli chcesz już się choćby odnosić do id kategorii lub tagu, który traktujesz owym group_contact to nie ma co na to liczyć.Tak to już jest, że zrobienie kilku zapytań jest czasem sensowniejsze logicznie niż kombinowanie z jednym, gdyż wykona się w krótszym sumarycznie czasie i/lub zwróci dokładniejsze/pełniejsze dane. To, że wiele osób z uporem maniaka składa z kilku jedno, (które zajeżdża bazę) nie znaczy że robią dobrze. Niektórych zresztą nie da się napisać bez utraty części informacji lub modyfikacji tabel.
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.