Webstatt.org - Community seit 2006 - 2012 (2024?)

Aus 2 Abfragen, eine machen.

Avatar user-125
24.07.2007 16: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' )"zwinkern;
$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

"zwinkern;
$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 .. traurig

Liebe user-125y aka user-125 aka dionysos
user-343
24.07.2007 16:21

Was ist "categorie" für eine Feldart?

user-152
24.07.2007 16: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' "zwinkern;
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"zwinkern;

$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.

Avatar user-125
24.07.2007 18: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);

Liebe user-125y aka user-125 aka dionysos
user-152
25.07.2007 07: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.

Avatar user-125
25.07.2007 08: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 ..

Liebe user-125y aka user-125 aka dionysos
user-152
25.07.2007 09: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-343
25.07.2007 10: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 lächeln

Avatar user-125
25.07.2007 13: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 lächeln Also gibts keine andere Möglichkeit?

Liebe user-125y aka user-125 aka dionysos
user-152
25.07.2007 14:24

@Dionysos

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

Avatar user-125
25.07.2007 15: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.

Liebe user-125y aka user-125 aka dionysos
user-343
25.07.2007 19:31

Original von user-125
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.

Avatar user-125
25.07.2007 20: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.

Liebe user-125y aka user-125 aka dionysos