Willkommen in der Webstatt
User-1 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.",%' ) ";
}


xyz-48ach 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?
User-2 am 24.07.07 18:21

Was ist "categorie" für eine Feldart?

User-3 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.

User-1 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);

User-3 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)
xyz-48n 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.

User-1 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 ..

User-3 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.

User-2 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 :)

User-1 am 25.07.07 15:50

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

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

User-3 am 25.07.07 16:24

@***

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

User-1 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.

User-2 am 25.07.07 21:31

Quote
Original von ***
Waxyz-190, 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.

User-1 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