Avatar billede jakobgt Nybegynder
07. maj 2005 - 01:39 Der er 9 kommentarer og
1 løsning

"Hvis ingen row's så en standard-row" i en forespørgel - hvordan?

Hej eksperter!

Jeg sidder og mangler lidt hjælp til en (måske) kompliceret SQL-query problem.
Jeg har 2 tabeller - en over alle tutorer i mit system (inkl. E-mailadresser) - kaldet 2005_Tutorer og så en gruppe-tabel, hvor der er 2 felter, en med tutorid (som korresponderer med tutorid'erne i 2005_Tutorer) og så mailalias, som er et suffix man kan sætte efter en generel tutor konto. F.eks. tutor+web@xxxxx giver en mail til alle tutorerne i web-gruppen (altså til deres personlige E-mailadresse). Det med at håndtere mailene kører fint, problemet er når folk kommer til at skrive f.eks. tutor+dette+findes+ikke@xxxx, så brokker den sig,for den gruppe eksisterer ikke. Det jeg så gerne vil have er at den MySQL-query (som mailsystemet) bruger, kan se om gruppen eksisterer, og hvis den gør, så returnerer MySQL gladeligt E-mailadresserne på tutorerne i den pågældende gruppe og hvis ikke, så sendes mailen til en fast bestemt E-mailadresse.
Jeg har brugt flg., men problemet med den query er at IF-funktionen i MySQL kun vil returnere een værdi, og altså ikke x antal rækker.:

select if(
/*Vi undersøger hvor mange rækker en evt. query kunne returnere, hvis der er 0, så skal vi ha' fat i den generelle E-mailadresse*/
0 in
(select count(*) from 2005_Tutorer natural join 2005_TutorIn as TI where TI.mailalias ='gruppenavn'),
/*Den generelle E-mailadresse */
'den generelle E-mailadresse',
/*vi har altså emailadresser i den pågældende gruppe */
(select email from 2005_Tutorer natural join 2005_TutorIn as TI where TI.mailalias ='gruppenavn'))

Hvis man tilføjer limit 0,1 til den sidste subquery, så virker det uden problemer, men hvis ikke så kommer MySQL med fejlen
#1242 - Subquery returns more than 1 row

Jeg kan ikke gennemskue hvordan det ellers kunne gøres.

På forhånd mange tak.
Avatar billede coderdk Praktikant
09. maj 2005 - 23:17 #1
Hvad med noget i stil med:

SELECT t.*, IF( ti.maialias IS NULL, 'genrel', ti.mailalias ) FROM 2005_Tutorer t NATURAL LEFT OUTER JOIN 2005_TutorIn ti
Avatar billede jakobgt Nybegynder
10. maj 2005 - 01:17 #2
hmm, det går heller ikke, for hvis jeg tilføjer where ti.mailalias = 'findes ikke' så returneres ikke  noget.
Avatar billede coderdk Praktikant
10. maj 2005 - 02:08 #3
Jeg har lige testet det på en anden database:

SELECT
  u.username
  ,IF(p.pagename IS NULL, 'default page', p.pagename) AS page
FROM
  punbb_users u
LEFT OUTER JOIN
  page p
ON
  u.id = p.byuser;

Den returnerer det jeg forventede - Alle usernames i databasen, og de brugere der havde oprettet en side stod navnet, ellers stod der "deault page":

mysql> SELECT
    ->  u.username
    ->  ,IF(p.pagename IS NULL, 'default page', p.pagename) AS page
    -> FROM
    ->  punbb_users u
    -> LEFT OUTER JOIN
    ->  page p
    -> ON
    ->  u.id = p.byuser;
+----------+------------------+
| username | page            |
+----------+------------------+
| Guest    | default page    |
| lars    | intro            |
| lars    | contact          |
| Mads    | test            |
| Mads    | dette er en test |
| Mads    | Test 2! Yeah!    |
| Vitus    | default page    |
+----------+------------------+
7 rows in set (0.00 sec)

Prøv evt. at fjerne NATURAL og specificér hvad du vil joine på...
Avatar billede coderdk Praktikant
10. maj 2005 - 02:10 #4
Og for at fjerne dubletter i primærtabellen, så bare tilføj en GROUP BY på primærtabellens primære nøgle ;)
Avatar billede jakobgt Nybegynder
10. maj 2005 - 15:13 #5
øhh, jeg tror jeg fik beskrevet det forkert. Jeg skulle kun have "default page"/"den generelle E-mailadresse" ud, hvis der slet ingen rækker returneres fra "select email from 2005_Tutorer natural join 2005_TutorIn as TI where TI.mailalias ='gruppenavn'"-querien.
Der returneres f.eks. ingen rækker hvis "gruppenavn" ikke eksisterer i tabellen.
Avatar billede coderdk Praktikant
10. maj 2005 - 19:11 #6
Ja, det ville jeg så løse programmatisk ;)
Avatar billede jakobgt Nybegynder
10. maj 2005 - 19:48 #7
hehe, ja men det kan jeg desværre ikke. Det er til noget procmail på unix, og der er ikke så meget at gøre.
Avatar billede coderdk Praktikant
10. maj 2005 - 20:00 #8
Hvorfor ikke? Kan procmail ikke bruge eksterne programmer? Skriv det i perl eller python eller sådan noget ;)
Avatar billede jakobgt Nybegynder
10. maj 2005 - 23:45 #9
Jaa, du siger selvfølgelig noget, men jeg er ikke lige den skarpeste kniv i skuffen til det pjat. Desuden virker systemet lige nu som det skal (altså når der er indtastet den rette E-mail-adresse), og derfor ville det jo være oplagt, hvis man bare ændrede i MySQL-querien.
Avatar billede jakobgt Nybegynder
23. maj 2005 - 23:04 #10
nå lukker spørgsmålet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester