Willkommen in der Webstatt Zum Webstatt Blog und Stories
bastey bastey am 24.07.07 18:16

Hallo. Folgendes Problem:
Ich habe eine Newstabelle in der ich ein Feld für die Kategorien habe und eine Tabelle für die Newskategorien. Nun gibt es die Möglichkeit in den Newskategorien die Kategorien Offline zu nehmen. Aber trotzdem kann man diese Auswählen (als Kategorie für die News).

Auf der Startseite will ich nun die letzten 3 News auslesen, die nicht in der 'Offline'-Cat sind. Die Kategorien (eine News kan viele haben) werden in der DB wie folgt gespeichert 1,2,3,4,5, etc.

Gegenwärtig löse ich das so, das ich erst alle Kategorien auslese die Offline sind und dadurch eine WHERE-Clausel erstelle:
$result = $db->query("SELECT `id`, `online` FROM `".$__cfg['mysql']['tables']['newscats']."` WHERE ( `online` = '0' )");
$offline_cats = '';
while($row = mysql_fetch_object($result)) {
$offline_cats .= " AND ( `categorie` NOT LIKE '%".$row->id.",%' ) ";
}


Danach diese WHERE-Clausel in die Newstabelle als Abfrage:
$result = $db->query("SELECT `id`, `date`, `topic`, `message`, `online`, `categorie`, `saved` FROM `".$__cfg['mysql']['tables']['news']."`

WHERE ( `online` = '1' )
AND ( `saved` = '1' )
".$offline_cats." ORDER BY `date` ASC LIMIT 3

");
$last_3_news = '';
while($row = mysql_fetch_object($result)) {
$last_3_news .= $row->id;
}


Es macht genau das, was es machen soll. Doch ich finde es zu viel. Ich denke, es geht sicher knapper. Aber ka .. hab mich nie so richtig in diese Richtung weitergebildet .. :(

netcup.de Warum gibt es hier Werbung?
Wasili am 24.07.07 18:21

Was ist "categorie" für eine Feldart?

CIX88 am 24.07.07 18:22

Besteht zwischen den Tabellen 'newscats' und 'news' eine Beziehung ?

Edit:

Etwas Zusammengefasst könnte erstmal so aussehen:

$result = $db->query("SELECT `id` FROM `".$__cfg['mysql']['tables']['newscats']."` WHERE `online` = '0' ");
while ( $row = mysql_fetch_object($result)) {

$result_2 = $db->query("SELECT * FROM `".$__cfg['mysql']['tables']['news']."`
WHERE `online` = '1' AND `saved` = '1' AND `categorie` NOT LIKE '%".$row->id."%' ORDER BY `date` ASC LIMIT 3");

$last_3_news = '';
while($row_2 = mysql_fetch_object($result_2)) {

$last_3_news .= $row_2->id;
}
}


Aber !
Ich kenne deine Feldtypen nicht, dann könnte man noch einiges verkürzen.

bastey bastey am 24.07.07 20:04

Mal meine DB:
-- phpMyAdmin SQL Dump
-- version 2.7.0-pl1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Erstellungszeit: 24. Juli 2007 um 20:16
-- Server Version: 5.0.15
-- PHP-Version: 5.0.5
--
-- Datenbank: `bsnvp`
--

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

--
-- Tabellenstruktur für Tabelle `newscats`
--

CREATE TABLE `newscats` (
`id` int(8) NOT NULL auto_increment,
`online` tinyint(1) NOT NULL,
`titel` varchar(80) collate latin1_general_ci NOT NULL,
`describe` varchar(200) collate latin1_general_ci NOT NULL,
`date` int(32) NOT NULL,
`autor` int(5) NOT NULL,
`last_id` int(8) NOT NULL,
`last_date` int(32) NOT NULL,
`total` int(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;

--
-- Daten für Tabelle `newscats`
--

INSERT INTO `newscats` VALUES (1, 1, 'Online', 'Diese Kategorie ist Online!', 1185293999, 1, 3, 1185294052, 0);
INSERT INTO `newscats` VALUES (2, 0, 'Offline', 'Diese ist Offline!', 1185294011, 1, 0, 1185294052, 0);


-- phpMyAdmin SQL Dump
-- version 2.7.0-pl1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Erstellungszeit: 24. Juli 2007 um 20:16
-- Server Version: 5.0.15
-- PHP-Version: 5.0.5
--
-- Datenbank: `bsnvp`
--

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

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

CREATE TABLE `news` (
`id` int(8) NOT NULL auto_increment,
`date` int(32) NOT NULL,
`autor` int(5) NOT NULL,
`topic` varchar(120) collate latin1_general_ci NOT NULL,
`message` text collate latin1_general_ci NOT NULL,
`online` tinyint(1) NOT NULL,
`allowed_comments` tinyint(1) NOT NULL,
`count_comments` int(6) NOT NULL,
`categorie` varchar(60) collate latin1_general_ci NOT NULL,
`saved` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=4 ;

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

INSERT INTO `news` VALUES (1, 1185293981, 1, 'Testnews 1', 'Diese Newst ist Online!', 1, 1, 0, '1,', 1);
INSERT INTO `news` VALUES (2, 1185294036, 1, 'Testnews 2', 'Diese News ist Online, aber in der Offline-cat!', 1, 1, 0, '2,', 1);
INSERT INTO `news` VALUES (3, 1185294052, 1, 'Testnews 3', 'Diese News ist in beiden Cats!', 1, 1, 0, '1,', 1);

CIX88 am 25.07.07 09:04

Ist von der Struktur etwas ungünstig angelegt.

Beser wäre:

Tabelle `newscats` mit id (gibt es ja schon)
Tabelle `news` mit cats_id (gibt es nicht)
Dann wäre die Beziehung id => cats_id.

Und vom Feldtyp wäre dann nur INT.
Damit würde das schneller gehen.

Die Geschichte mit `categorie` verstehe ich nicht ganz.

bastey bastey am 25.07.07 10:53

ja schon klar. In categorie werdne mehrere Kategorien eingetragen. Also ID_DER_CAT, ID_DER_ANDEREN_CAT, ... und so weiter. Weil die alle mehr Kategorien haben sollen. Das ist ja mein Problem!

Die News werden nur angezeigt, wenn die News an sich selber Online ist gesaved worden ist, sowie die Kategorie ONLINE ist (un dkeine andere ausgewählte Offline).

Ziemlich doof ..

CIX88 am 25.07.07 11:16

Achso, die jeweiligen News sind mehreren Kategorien zugeordnet ?
Falls ja, dann ist das aber eine schlechte Lösung bezüglich auf Verarbeitung bzw. Performance.
Abfragen von Feldern mit varchar dauern immer länger als z.B. Int.

Ich hätte die News nur einer Kategorie zugeordnet, und somit hätte ich nur eine ID, was dann mein Bezugspunkt ist.

Wasili am 25.07.07 12:46

Kannst du das im Nachhinein noch ändern? Hier wäre wohl eine dritte Tabelle, mit nur 2 Spalten - newsid und catid - nützlich, um deinen Query zu verkleinern. Dabei sollst du den Primärschlüssel so setzen, dass newsid und catid *zusammen* einzigartig sind (1 - 2 und 1 - 3 nebenbei sind möglich).

CREATE TABLE `newsncats` (
`newsid` INT unsigned NOT NULL ,
`catid` INT unsigned NOT NULL ,
PRIMARY KEY ( `newsid` , `catid` )
);


Sonst bleibst du bei deinen 2 Querys leider hängen :)

bastey bastey am 25.07.07 15:50

Wasili, da seh ich aber wieder nur eine Kategorie als Mögliche. Oder ich habs eben net kapiert.

CIX88 - Ja, sicherlich könnte ich das mit einer machen. Will ich aber nicht :) Also gibts keine andere Möglichkeit?

CIX88 am 25.07.07 16:24

@Dionysos

Hmmm, ne so wirklich eine besser Möglichkeit, die auch bessere Performance bringt, sehe ich in dieser Struktur nicht.

bastey bastey am 25.07.07 17:48

Es ist halt so, dass es an sich ein nettes Feature ist.
Man kann ganz viele Kategorien erstellen und News in den verschiedensten einordnen. Und wenn man nicht will das News zum Thema "Drogen" erscheinen, nimmt man einfach die Kategorie offline und somit auch die News.

Wasili am 25.07.07 21:31

Quote
Original von Dionysos
Wasili, da seh ich aber wieder nur eine Kategorie als Mögliche. Oder ich habs eben net kapiert.


Natürlich gehen mehrere. Du hasts nicht kapiert ^^

INSERT INTO `newsncats` (`newsid`, `catid`) VALUES
(1, 1), (1, 2), (1, 3), # News 1 mit den Kategorien 1, 2 und 3
(2, 13), (2, 4), (2, 28), # News 2 mit den Kategorien 13, 4 und 28


Da sich der Primärschlüssel über beide Felder legt ist das möglich.

bastey bastey am 25.07.07 22:25

So meinst du das. Aber ich sehe gerade keinen Ansatz bzw. keine Möglichkeit das jetzt zu kombinieren. Sprich, ich muss ja noch immer die Daten in nem extra Select über die Kategorien auslesen. Also im Endeffekt hilft mir das nicht, mit der 3. Tabelle. Es geht ja nicht daraum zu erfahren welche Kategorien dazugehören, sondern welche davon Offline sind. Und sobald eine Kategorie Offline ist soll die News net angezeigt werden.

Sprich:
News 1 hat Kategorien: 1 2 3.
Die 2 ist Offline. Also wird News 1 nicht ausgegeben.
News 2 hat Kategorien 1 und 3. Beide Online, also ausgabe.

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt