Datensätze mit einer bestimmten ID ausgeben.

F

fabs

Aktives Mitglied
Thread Starter
Dabei seit
19.06.2005
Beiträge
255
Reaktionspunkte
1
Hi, ich habe vor mir ein kleines Newssystem zu basteln. Hierbei werden die news in verschiedene Kategorien unterteilt und in eine Feld gespeichert.

also zum Beispiel so!

News_id - Kategorie
1 - 1,2
2 - 2
3 - 1
4 - 2,3,4
5 - 12,3

Wie kann ich jetzt alle Datensätze abrufen wo die id 2 vorkommt?

Danke, fabs
 
fabs schrieb:
News_id - Kategorie
1 - 1,2
2 - 2
3 - 1
4 - 2,3,4
5 - 12,

Das ist sehr unschön und nicht sehr professionel.

Normalerweise macht man das über eine Zwischentabelle. (Auflösung einer m-m Beziehung wenns dich interessiert).

Also:
Du hast 3 Tabellen:

News: Hier werden die News gespeichert, die muss mindestens diese spalten haben:

news_id news_text ...usw

Kategoriene: Hier werden die verschiedenen kategoriene gespeichert.

kategorie_id kategorie_name

news_kategorie: Jetzt kommt der Trick :) in dieser zwischentabelle werden einer news die kategorieen zugeordnet.

news_id kategorie_id

die einträge könnten dann etwa so ausehen:

1 1
1 2
1 3

dann gehört die news 1 zu den kategorien 1, 2 und 3.

habe hier mal eine beispiel DB als sqldump:
Code:
-- phpMyAdmin SQL Dump
-- version 2.8.1
-- http://www.phpmyadmin.net
-- 
-- Host: localhost
-- Erstellungszeit: 24. August 2006 um 18:17
-- Server Version: 5.0.21
-- PHP-Version: 5.1.4
-- 
-- Datenbank: `suem`
-- 

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `kategorie`
-- 

CREATE TABLE `kategorie` (
  `kat_id` int(11) NOT NULL auto_increment,
  `kat_name` text collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`kat_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=4 ;

-- 
-- Daten für Tabelle `kategorie`
-- 

INSERT INTO `kategorie` VALUES (1, 'Computer');
INSERT INTO `kategorie` VALUES (2, 'OS');
INSERT INTO `kategorie` VALUES (3, 'Apple');

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `news`
-- 

CREATE TABLE `news` (
  `news_id` int(11) NOT NULL auto_increment,
  `news_name` text collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`news_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;

-- 
-- Daten für Tabelle `news`
-- 

INSERT INTO `news` VALUES (1, 'Leopard kommt im Frühling');
INSERT INTO `news` VALUES (2, 'Bill gates run''s like a girl');

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `news_kategorie`
-- 

CREATE TABLE `news_kategorie` (
  `news_id` int(11) NOT NULL,
  `kat_id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

-- 
-- Daten für Tabelle `news_kategorie`
-- 

INSERT INTO `news_kategorie` VALUES (1, 1);
INSERT INTO `news_kategorie` VALUES (1, 2);
INSERT INTO `news_kategorie` VALUES (1, 3);
INSERT INTO `news_kategorie` VALUES (2, 2);

MIt diesem Query kannst du jetzt alle news auslesen, die zur kategorie 2 gehören

SELECT news.news_name
FROM news, news_kategorie
WHERE news_kategorie.kat_id =2
AND news_kategorie.news_id = news.news_id






mfg
 
Zuletzt bearbeitet:
Hi, dies wäre meine zweite Möglichkeit gewesen das zu realisieren. Kommt hierbei nicht eine sehr große Menge an Daten zusammen. Immerhin gibt es so pro News viele Kategorie einträge?

Oder fällt das nicht ins "gewicht"?
 
nö ins gewicht fällt das nicht...

diese sogenannte Normalform für Tabellen erleichtert dir einiges an Arbeit, wenn du etwas verändern willst... :)

machs einfach so und kümmere dich nicht um die Anzahl Einträge...

Simu
 
simusch schrieb:
nö ins gewicht fällt das nicht...

diese sogenannte Normalform für Tabellen erleichtert dir einiges an Arbeit, wenn du etwas verändern willst... :)

machs einfach so und kümmere dich nicht um die Anzahl Einträge...

Simu


Stimmt die Normalenform ist sehr hilfreich!

Außerdem wen interssieren bei 3-stelligen Gigabytes auf Festplatten auch nur ein paar 100.000 Zahlenpaare im 8 oder 16 Bit Format? Früher hat man mit sowas gegegeizt. Heute nutzt man das zur Beschleunigung! Nur zu, wo es doch schon so ausführlich erläutert wurde!
 
Da habe ich auch noch eine Frage :)

Wenn ich die News unterteilt habe:

• Headline
• Autor
• Text
• Datum

Zusätzlich habe ich teilweise noch Fotos dabei oder Videos:

• FotoURL
• FotoThumbnailURL

• VideoURL
• VideoScreenshotURL

Wie baue ich dann die Datenbank auf? Kann ich meine wie oben "zusammengefassten" Felder in jeweils eine Tabelle speichern? Und dann die Auflösungstabelle dazu? Oder für "Autor", "Datum", "Headline" etc. jeweils eine Tabelle mit Auflösungstabelle? Auf irgendwas muss ich mich ja beziehen ;)

2nd
 
Verknüpfe die Tabellen mit einer BenutzerID, als Beispiel. Dann kannst Du drei Tabellen draus machen, jeweils ergänzt um die BenutzerID.
 
Soll man diese oben angeführte "Technik" auch für Galerien verwenden zu der Bilder verknüpft werden?

Also so zb

Tabelle Bild2Galerie (BID = Bild ID, GID = Galerie ID)
ID - GID - BID
1 - 1 - 1
1 - 1 - 2
1 - 1 - 3
1 - 1 - 4
1 - 2 - 1
1 - 2 - 5

etc?
 
fabs schrieb:
Soll man diese oben angeführte "Technik" auch für Galerien verwenden zu der Bilder verknüpft werden?

Also so zb

Tabelle Bild2Galerie (BID = Bild ID, GID = Galerie ID)
ID - GID - BID
1 - 1 - 1
1 - 1 - 2
1 - 1 - 3
1 - 1 - 4
1 - 2 - 1
1 - 2 - 5

etc?

der DB ist nun wirklich egal, was Du mit den Zahlen verwaltest ;)
Die Technik ist durchaus empfehlenswert bei relationalen DBMS!
 
Den hatte ich heute früh gefunden, trotzdem danke für den Link:)

Sojus beschreibt ja oben die vollständig normalisierte Form (3NF). Aber was spricht gegen eine Mischform nach der 2NF Normalisierung?

2nd
 
2ndreality schrieb:
Den hatte ich heute früh gefunden, trotzdem danke für den Link:)

Sojus beschreibt ja oben die vollständig normalisierte Form (3NF). Aber was spricht gegen eine Mischform nach der 2NF Normalisierung?

2nd
Doppelte Datensätze! Wenn Dir der Wurm mal passiert, haste ein großes Problem.
 
Zurück
Oben Unten