Jetzt Mitglied werden
Kostenlos registrieren und die vielen Vorteile der Webmasterpro-Mitgliedschaft nutzen.
Forum - Entwicklung
- Markup (HTML, XML, etc.) und CSS
- Skriptsprachen (PHP, Javascript, etc.)
- Datenbanken (SQL)
- CMS und Frameworks
- Flash und ActionScript
Info: Der Stern signalisiert, dass neue Beiträge vorhanden sind.
Alle Foren - Übersicht
Portal aktuelle Themen
Design aktuelle Themen
Server aktuelle Themen
- Webhosting und Webspace
- Betriebssysteme (Windows, Linux, etc.)
- Serveradministration
- Überwachung, Sicherheit und Backups
Management aktuelle Themen
Über Webmasterpro.de
Das Portal wird betrieben und entwickelt durch die Team23 Agentur. Die Augsbuger Agentur hat sich auf Community Software und die Entwicklung von Webportalen spezialisiert.
Datenbanken (SQL) - Forum
Derzeit sind Sie als Gast in unserem Forum aktiv. Für das Schreiben registrieren Sie sich bitte. Unser Forum ist eine Austauschplattform für Webworker zum Kommunizieren, Helfen, Informieren und Hilfe finden. Auf der rechten Seiten finden Sie eine Forenübersicht über alle Bereiche des Webmaster-Forums. Unterhalb finden Sie alle aktuellen Themen.
MySQL Query
Hi, ich weiß nicht so ganz wie ich folgenden Query erstellen soll.
2 Tabellen. Eine "Suchbegriffe" und eine "Suchbegriffe Position".
Nun möchte ich von einem Suchbegriff die neue Position abfragen, jedoch nur, wenn dieser heute noch nicht abgefragt wurde. Und immer nur 1 Suchbegriff abfragen. (Grund: läuft per Cronjob).
Die WHERE Abfrage egstaltet sich ja relativ einfach:
Nun könnte jedoch zu dem Suchbegriff ja bereits ein neuer Positios-Eintrag vorhanden sein.
Also würde ich wohl group by verwenden.
1 | $groupBy = 'GROUP BY(`suchbegriffId`)';
|
Oder? Komme da leider nicht so ganz weiter, da ja auch mit GROUP BY ein ältere positionabfrage vorhanden sein kann und damit wäre die WHERE Klausel ja erfolgreich.
Alternativ könnte ich alle Suchbegriffe durchgehen, dort die aktuellste Position abfragen und wenn die heute getätigt wurde den nächsten Suchbegriff abfragen, wenn nicht, dann diesen Suchbegriff für das Skript verwenden. Wäre mir aber irgendwie zuviel Datendurchlauf der nicht sein muss.
Vielen Dank soweit.
Ich glaube, ich versteh nicht ganz genau, was die Tabellen machen.
Ich habe es nun so verstanden, dass du diese Tabelle mit den Positionen hast, in denen Einträge auch mehrfach vorkommen können. Dann willst du einen beliebigen, der an diesem Tag noch nicht bearbeitet wurde auswählen und zwar davon immer den neusten?
Wenn es denn so ist, ist das eine sehr einfache Lösung:
Deine WHERE-Klausel lässt du stehen, sortierst die Einträge absteigend nach der id (der spätere hat ja automatisch eine höher id) und hängst noch ein LIMIT 1 dran. Dann ist dein Ergebnis entweder leer oder der aktuellste Eintrag.
... aber irgendwie habe ich das Gefühl, dass das nicht dein Aufbau ist...
Sorry, dann habe ich mich wohl nicht klar genug ausgedrückt.
Also: 2 Tabellen.
Tabelle 1: Suchbegriffe
- id
- suchbegriff
- kundennummer
- blablabla
Tabelle 2: Suchbegriffe-Positionen:
- id
- suchbegriffId
- date
- position
Jetzt gibt es z.b. die Suchbegriffe "Auto" und "Lkw".
In der Tabelle Suchbegriffe Positionen gibts dann die Einträge:
1: id = (die vom auto), date = 01.01.2010 (im unix timestamp format) und Position 5
2: id = (die vom auto), date = 10.01.2010 (auch unix...) und Position 3
usw... (das gleiche für lkw).
nun will ich einen suchbegriff laden, der heute noch nicht auf seine position geprüft wurde.
ginge einfach per
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $sql = mysql_query('SELECT * FROM suchbegriffe');
$search = true;
$suchbegriffId = 0;
$today = mktime(0,0,0,date('m'),date('d'),date('Y'));
while($suchbegriff = mysql_fetch_object($sql) && $search)
{
$suchbegriffId = $suchbegriff->id;
$pos = mysql_fetch_object(mysql_query('SELECT * FROM suchbegriffe_positionen WHERE suchbegriffId='.$suchbegriff->id.' ORDER BY date DESC LIMIT 1'));
if($pos->date < $today)
$search = false;
}
//Nun weiter im Script
if($search === false)
{
//Suchbegriff ist jetzt zu laden aus $suchbegriffId;
}
|
Soweit so gut, dauert aber deutlich zu lange, alle Suchbegriffe durchgehen zu müssen, irgendwie kann man das kombinieren. nur wie? das bekomme ich nicht ganz hin.
Danke.
Hey,
hatte nicht die Zeit alles zu lesen, aber versuchs mal so:
(Beim current-Date musste ggf. noch die Uhrzeit abschneiden.)
1 | SELECT tab1.* FROM tab1 INNER JOIN tab2 ON tab2.id = tab1.id AND tab2.date < CURRENT_DATE()
|
Funktioniert leider gar nicht. Ich bekomme immer ein leeres Resultat. Kenn mich mit dem JOIN jedoch auch nicht so aus, bei left join erhalte ich IMMER alle datensätze...
Mein SQL nach deinem Format (mit leerem ergebnis!) sieht wie folgt aus:
1 2 3 4 | SELECT sena_kunden_suchbegriffe.* FROM sena_kunden_suchbegriffe INNER
JOIN sena_kunden_suchbegriffe_pos ON
sena_kunden_suchbegriffe_pos.suchbegriffId = sena_kunden_suchbegriffe.id
AND sena_kunden_suchbegriffe_pos.date < 1272578400
|
INNER JOIN ist in deinem Fall schon Ok.
Du möchtest ja auch nur Datensätze finden, wo es eine Zuordnung gibt:
1 2 3 4 5 6 7 8 9 10 | SELECT
s.*
FROM
suchbegriffe s
INNER JOIN suchbegriffe_positionen sp ON sp.suchbegriffId=s.id
WHERE
sp.date<1272578400
ORDER BY
s.date
DESC
|
Was hast du denn abgeändert? (Bis auf die Sortierung) Klappt so leider auch nicht, mal zur verdeutlichung die aktuelle Schleife:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $sql = mysql_query('SELECT * FROM '.DB_PREFIX.'kunden_suchbegriffe');
$search = true;
$suchbegriffId = 0;
$today = mktime(0,0,0,date('m'),date('d'),date('Y'));
while($suchbegriff = mysql_fetch_object($sql))
{
$suchbegriff2 = $suchbegriff;
$pos = mysql_fetch_object(mysql_query('SELECT * FROM '.DB_PREFIX.'kunden_suchbegriffe_pos WHERE suchbegriffId='.$suchbegriff->id.' ORDER BY `date` DESC LIMIT 1'));
if($pos->date < $today)
$search = false;
if($search === false)
break;
}
|
Mit $suchbegriff2 arbeite ich dann weiter..
Die DB sieht so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | CREATE TABLE IF NOT EXISTS `sena_kunden_suchbegriffe` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`suchbegriff` varchar(250) NOT NULL,
`leistungId` int(11) NOT NULL,
`kdnr` varchar(250) NOT NULL,
`date` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `sena_kunden_suchbegriffe_pos`
--
CREATE TABLE IF NOT EXISTS `sena_kunden_suchbegriffe_pos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`suchbegriffId` int(11) NOT NULL,
`date` int(11) NOT NULL,
`pos` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
Der Suchbegriff wird in der ersten Tabelle gespeichert, alle Positionen in der 2ten..
Wie gesagt es funktioniert ja, nur bei einer mehr gefüllten Datenbank wird es dann sehr langsam, dass will ich vermeiden.
Danke soweit.
Ginge ein Lösungsansatz wie:
SELECT Suchbegriffe-Positionen, GROUP BY Id Des Suchbegriffes WHERE DATE < $time LIMIT 1?

