Rejoindre différentes tables en fonction de la valeur de la colonne
J'ai une table appelée notifications
:
CREATE TABLE `notifications` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`type` varchar(20) NOT NULL DEFAULT '',
`parent_id` int(11) DEFAULT NULL,
`parent_type` varchar(15) DEFAULT NULL,
`type_id` int(11) DEFAULT NULL,
`etc` NULL
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;
Chaque notification
est liée à une autre table, la valeur de parent_type
champ spécifie le nom de la table que je veux * join
la table avec. Toutes les tables ont plusieurs colonnes similaires:
CREATE TABLE `tablename` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`is_visible` tinyint(1) NOT NULL,
`etc` NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
Actuellement, je suis en utilisant cette requête pour sélectionner les notifcations que leur ligne dans la table cible existe et de leur is_visible
champ est 1
:
SELECT n.id,
FROM notifications n
LEFT JOIN books b ON n.parent_id = b.id AND n.parent_type = 'book' AND b.is_visible = 1
LEFT JOIN interviews i ON n.parent_id = i.id AND n.parent_type = 'interview' AND i.is_visible = 1
LEFT JOIN other tables...
WHERE n.user_id = 1
GROUP BY n.id
Mais puisque c'est un LEFT JOIN
il renvoie la notification si elle correspond à une table ou pas, comment je peux le réécrire afin de ne pas retourner les notifications qui ne correspondent pas à une ligne dans la table cible? J'ai aussi essayé le CASE
déclaration en vain.
source d'informationauteur undefined
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas 100% sûr que la syntaxe est bonne et je n'ai aucune chance de le tester en ce moment, mais l'idée doit être clair.