webForumDet fria alternativet

Fråga för urval av duplicerade rader samt icke befintliga rader?

Databaser & SQL

3 svar · 326 visningar · startad av LR^evil.sid

Medlem sedan maj 2002560 inlägg
Frågan#1

DBMS: MySQL 5.01

Nuvarande SQL-fråga:
SELECT DISTINCT kundnummer.entitet, SUBSTRING_INDEX(namn,' ',1) AS namn, efternamn, adress, CONCAT(LEFT(postnr,3), ' ', SUBSTRING(postnr, -2)) AS postnr, CONCAT(UCASE(LEFT(ort, 1)), LCASE(SUBSTRING(ort, -(CHAR_LENGTH(ort)-1)))) AS ort, form, '2007-04-30'
FROM abformer
INNER JOIN kundnummer ON abformer.abid=kundnummer.abid
INNER JOIN kunder ON kunder.kundid=kundnummer.kundid
LEFT JOIN utskick ON kundnummer.entitet=utskick.entitet
WHERE utskick.brevId=1 AND utskick.datum < '2006-11-01' AND (kundnummer.bindningstid < DATE_ADD(CURDATE(), INTERVAL 3 MONTH) OR kundnummer.bindningstid IS NULL) AND NOT CONCAT(adress, postnr, ort) IS NULL ORDER BY utskick.datum DESC, abformer.grupp ASC

Önskat resultat: Ett recordset med samtliga rader ur tabellen `utskick` vars senaste utskicksdatum är tidigare än 3 månader sedan och de rader i tabellen `kundnummer` som helt saknar utskick.

Nuvarande rutin:
1 Töm utskriftstabellen.
2 Välj ut de poster som skall få ett utskick.
3 Lägg dessa i särskilld utskriftstabell.
4 Lägg även in dessa i tabellen `utskick` (eftersom vi gjort ett nytt utskick till dem).
5 Flytta tidigare urval till `backuptabell`.

Problem 1: De rader jag väljer ut läggs, som sagt, in i tabellen `utskick` (alltså finns det duplicerade identifierare i denna tabell) men eftersom det måste vara minst 3 månader sedan senaste utskick till respektive kund så fungerar inte min WHERE-klasul "utskick.datum < '2006-11-01'". Alla utskick som gjorts på respektive kund på tidigare datum kvalificerar kunden för ett nytt utskick.

Problem 2: Jag har inte löst hur jag samtidigt som jag måste jämnföra "kundnummer.entitet=utskick.entitet" även måste jämnföra "WHERE utskick.entitet IS NULL"

Tabell: Kundnummer
kundId|entitet|abid|bindningstid

Tabell: Utskick
entitet|brevid|datum

Tabell: Abformer
abid|form|grupp

Tabell: Kunder
kundId|namn|efternamn|adress|postnr|ort

Medlem sedan maj 2002560 inlägg
#2

En ide jag har om en lösning på problem 1, men inte vet hur jag skall implementera, är att göra ett urval av de poster som inte kvalificerar sig p.g.a. det senaste utskicket och ha med dem i WHERE-klasulen att dessa id:n inte får finnas med.

Medlem sedan dec. 19996 721 inlägg
#3

Problem 1:

Du har rätt tanke. Du får lägga till något i stil med

AND kundnummer.entitet NOT IN (SELECT entitet FROM utskick WHERE datum >= '2006-11-01')

eller så gör du en extra LEFT

LEFT JOIN utskick u2 ON kundnummer.entitet=u2.entitet AND u2.datum >= '2006-11-01'

och lägger till ett villkor som gör att rader som matchas inte får vara med

WHERE u2.entitet IS NULL

Problem 2:

Så fort du ger villkor till utskick-tabellen i WHERE satsen så blir det i praktiken en INNER JOIN. Med andra ord måste du skilja på de som ska matchas och de som inte hittades.

WHERE (utskick.brevId=1 AND utskick.datum < '2006-11-01'  OR utskick.entitet IS NULL) ....

Varsågod och sätt ihop... :)

Medlem sedan maj 2002560 inlägg
#4

såklart, tack skall du ha

252 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)