Jetzt Mitglied werden

Kostenlos registrieren und die vielen Vorteile der Webmasterpro-Mitgliedschaft nutzen.

Login für Mitglieder

Forum - Entwicklung

Info: Der Stern signalisiert, dass neue Beiträge vorhanden sind.

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


K. K.
Beiträge: 179

PN schreiben
Profil ansehen
User ist offline

MySQL Query

Link zur Antwort auf "MySQL Query" von K. K. K. K., am Donnerstag den 29.04.2010 um 17:19:32

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:

 
PHP
1
$where = 'WHERE `suchbegriffe_pos`.`date` < '.mktime(0,0,0,date('m'),date('d'),date('Y'));

Nun könnte jedoch zu dem Suchbegriff ja bereits ein neuer Positios-Eintrag vorhanden sein.

Also würde ich wohl group by verwenden.

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

Link zur Antwort auf "MySQL Query" von Jannik Zschiesche Jannik Zschiesche, am Donnerstag den 29.04.2010 um 23:29:40

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


K. K.
Beiträge: 179

PN schreiben
Profil ansehen
User ist offline
Link zur Antwort auf "MySQL Query" von K. K. K. K., am Freitag den 30.04.2010 um 06:18:30

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

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


joerg [∙√]
Beiträge: 107

PN schreiben
Profil ansehen
User ist offline
Link zur Antwort auf "MySQL Query" von joerg [∙√] joerg [∙√], am Freitag den 30.04.2010 um 08:02:03

Hey,

hatte nicht die Zeit alles zu lesen, aber versuchs mal so:

(Beim current-Date musste ggf. noch die Uhrzeit abschneiden.)

 
sql
1
SELECT tab1.* FROM tab1 INNER JOIN tab2 ON tab2.id = tab1.id AND tab2.date < CURRENT_DATE()


K. K.
Beiträge: 179

PN schreiben
Profil ansehen
User ist offline
Link zur Antwort auf "MySQL Query" von K. K. K. K., am Freitag den 30.04.2010 um 08:57:25

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:

 
sql
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

Patrick Schwering
Beiträge: 74

PN schreiben
Profil ansehen
User ist offline
Link zur Antwort auf "MySQL Query" von Patrick Schwering Patrick Schwering, am Montag den 03.05.2010 um 12:21:07

INNER JOIN ist in deinem Fall schon Ok.

Du möchtest ja auch nur Datensätze finden, wo es eine Zuordnung gibt:

 
sql
 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

K. K.
Beiträge: 179

PN schreiben
Profil ansehen
User ist offline
Link zur Antwort auf "MySQL Query" von K. K. K. K., am Montag den 03.05.2010 um 14:41:41

Was hast du denn abgeändert? (Bis auf die Sortierung) Klappt so leider auch nicht, mal zur verdeutlichung die aktuelle Schleife:

 
PHP
 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:

 
sql
 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?