chrisfah
Goto Top

MySQL Ersatz für EXCEPT

hallo leute,
wieder einmal wende ich mich hilfesuchend an Euch:

ich habe zwei Mysql queries , deren Ergebnis sich ausschlissen soll:
$query1 = 'SELECT kw, path FROM kw WHERE lang_id = '.intval($l['id']).' AND plain_kw REGEXP "^[0-9]" AND active = 1 AND use_as = 0 ORDER BY count DESC, kw ASC LIMIT 200';

$query2 = 'SELECT id, kw, path FROM kw WHERE lang_id = '.intval($l['id']).' AND plain_kw REGEXP "^[0-9]" AND active = 1 AND use_as = 0 ORDER BY date_added DESC LIMIT 200';

Beide Abfragen suchen in der gleichen tabelle, die erste nach den 200 meisten 'counts' , die zweite nach den 200 neuesten Einträgen.
Als Ergebnis suche ich jene 200 der ersten Abfrage, die NICHT in der zweiten Abfrage gelistet sind.

MIt (query1) EXCEPT (query2) geht es unter Mysql nicht.

Auch folgendes klappt nicht, da Mysql in Subqueries kein LIMIT unterstützt.
$query = 'SELECT id, kw, path FROM kw
WHERE id NOT IN
(SELECT id FROM kw WHERE lang_id = '.intval($l['id']).' AND plain_kw REGEXP "^[0-9]" AND active = 1 AND use_as = 0 ORDER BY date_added DESC LIMIT 200)
AND lang_id = '.intval($l['id']).' AND plain_kw REGEXP "^[0-9]" AND active = 1 AND use_as = 0 ORDER BY count DESC, kw ASC LIMIT 200 ';


Hat da wer einen Tip für mich?

Lg, Chris

Content-Key: 243174

Url: https://administrator.de/contentid/243174

Printed on: April 23, 2024 at 15:04 o'clock

Member: ChrisFah
ChrisFah Jul 09, 2014 at 20:50:18 (UTC)
Goto Top
Ich denke, ich hab eine Lösung gefunden:

$query = 'SELECT id, kw, path FROM kw a
WHERE NOT EXISTS
(SELECT id FROM kw b WHERE plain_kw REGEXP "^[0-9]" AND lang_id = '.intval($l['id']).' AND active = 1 AND use_as = 0 AND a.id = b.id ORDER BY date_added DESC LIMIT 200)
AND plain_kw REGEXP "^[0-9]" AND lang_id = '.intval($l['id']).' AND active = 1 AND use_as = 0 ORDER BY count DESC, kw ASC LIMIT 200 ';

So scheint es auf den ersten Blick zu klappen. Vielleicht kann noch mal jemand ein Auge draufwerfen... Danke!

Lg, Chris
Member: colinardo
Solution colinardo Jul 09, 2014, updated at Jul 13, 2014 at 20:47:16 (UTC)
Goto Top
Hi,
probier mal das hier:
SELECT a.id, a.kw, a.path 
FROM kw as a
LEFT JOIN (
  SELECT id 
  FROM kw 
  WHERE lang_id = '.intval($l['id']).'   
  AND plain_kw REGEXP "^[0-9]"  
  AND active = 1 
  AND use_as = 0 
  ORDER BY date_added DESC LIMIT 200
) AS b USING (id)
WHERE lang_id = '.intval($l['id']).'   
AND plain_kw REGEXP "^[0-9]"   
AND active = 1
AND use_as = 0
AND b.id IS NULL
ORDER BY count DESC, kw ASC LIMIT 200 ';  
Grüße Uwe