8.7.1 Trouver tous les jumeaux non distribués

8.7.1 Trouver tous les jumeaux non distribués

Les requêtes suivantes sont utilisées pour sélectionner les couples de jumeaux qui accèderont à la deuxième phase :@:

select
concat(p1.id, p1.tvab) + 0 as tvid,
concat(p1.christian_nom, " ", p1.surnom) as Nom,
p1.postal_code as Code,
p1.city as City,
pg.abrev as Area,
if(td.participation = "Aborted", "A", " ") as A,
p1.dead as dead1,
l.event as event1,
td.suspect as tsuspect1,
id.suspect as isuspect1,
td.severe as tsevere1,
id.severe as isevere1,
p2.dead as dead2,
l2.event as event2,
h2.nurse as nurse2,
h2.doctor as doctor2,
td2.suspect as tsuspect2,
id2.suspect as isuspect2,
td2.severe as tsevere2,
id2.severe as isevere2,
l.finish_date
from
twin_project as tp
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var For Twin 1 mysql/ php/
left join twin_data as td on tp.id = td.id and tp.tvab = td.tvab
left join informant_data as id on tp.id = id.id and tp.tvab = id.tvab
left join harmony as h on tp.id = h.id and tp.tvab = h.tvab
left join lentus as l on tp.id = l.id and tp.tvab = l.tvab
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var For Twin 2 mysql/ php/
left join twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab
left join informant_data as id2 on p2.id = id2.id and p2.tvab = id2.tvab
left join harmony as h2 on p2.id = h2.id and p2.tvab = h2.tvab
left join lentus as l2 on p2.id = l2.id and p2.tvab = l2.tvab,
person_data as p1,
person_data as p2,
postal_groups as pg
where
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var p1 gets main twin and p2 gets his/her twin. mysql/ php/
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var ptvab is a field inverted from tvab mysql/ php/
p1.id = tp.id and p1.tvab = tp.tvab and
p2.id = p1.id and p2.ptvab = p1.tvab and
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var Just the sceening survey mysql/ php/
tp.survey_no = 5 and
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var Skip if partner died before 65 but allow emigration (dead=9) mysql/ php/
(p2.dead = 0 or p2.dead = 9 or
(p2.dead = 1 and
(p2.mort_date = 0 or
(((to_days(p2.mort_date) - to_days(p2.naissanceday)) / 365)
>= 65))))
and
(
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var Twin is suspect mysql/ php/
(td.future_contact = 'Yes' and td.suspect = 2) or
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var Twin is suspect - Informant is Blessed mysql/ php/
(td.future_contact = 'Yes' and td.suspect = 1 and id.suspect = 1) or
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var No twin - Informant is Blessed mysql/ php/
(ISNULL(td.suspect) and id.suspect = 1 and id.future_contact = 'Yes') or
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var Twin broken off - Informant is Blessed mysql/ php/
(td.participation = 'Aborted'
and id.suspect = 1 and id.future_contact = 'Yes') or
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var Twin broken off - No inform - Have partner mysql/ php/
(td.participation = 'Aborted' and ISNULL(id.suspect) and p2.dead = 0))
and
l.event = 'Finished'
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var Get at area code mysql/ php/
and substring(p1.postal_code, 1, 2) = pg.code
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var Not already distributed mysql/ php/
and (h.nurse is NULL or h.nurse=00 or h.doctor=00)
/bin /boot /capture1.png /courier-imap-1.3.10-1.7.1.i386.rpm /courier-imap-maildirmake-1.3.12-7.i386.rpm /courier-imap-mysql-1.3.10-1.7.1.i386.rpm /dev /etc /home /initrd /iptables /lib /lost+found /misc /mnt /opt /proc /root /rsh-0.17-5.i386.rpm /sbin /tmp /usr /var Has not refused or been aborted mysql/ php/
and not (h.status = 'Refused' or h.status = 'Aborted'
or h.status = 'Died' or h.status = 'Other')
order by
tvid;

Quelques explications s'imposent :@:

  • concat(p1.id, p1.tvab) + 0 as tvid

    On veut trier les valeurs avec la concaténation de id et tvab dans un ordre numérique. Ajouter 0 au nombre force MySQL à traiter le résultat comme un nombre

    column id

    Ceci identifiera un couple de jumeaux. C'est une clé commune à toutes les tables.

    column tvab

    Cette colonne identifie un des jumeaux dans un couple. Il prend la valeur de 1 ou 2.

    column ptvab

    C'est le complémentaire de la colonne précédente. Quand tvab vaut 1 celle-ci vaut 2, et vice versa. Elle sert à éviter des saisie, et permet à MySQL d'optimiser la requête.

    Cette requête démontre, entre autres choses, comment faire des recherches dans une table à partir de la même table, grce à un regroupement ( (p1 et p2). Dans l'exemple ci-dessus, on s'en sert pour vérifier si le deuxième jumeau n'est pas mort avant l'age de 65 ans. Dans ce cas, la ligne n'est pas renvoyée.

    Toutes les informations ci-dessus existent dans les tables sur les jumeaux. Il y a toujours une clé sur id,tvab (toutes tables) et id,ptvab (person_data) pour rendre les requêtes plus rapides.

    Sur notre serveur de production (une station Sun UltraSPARC 200MHz), cettre requête retourne entre 150 et 200 lignes, et prend moins d'une seconde.

    Le nombre courant de ligne dans les tables sont les suivants :@: