2013-09-01 33 views
10

Bir tablo notifications denilen vardır:sütun değerine bağlı olarak farklı tabloyu birleştirmek

Her notification farklı bir tablo ile ilgilidir
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=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8; 

, parent_type alanının değeri ben * join istediğiniz tablonun adını belirtir ile tablo.

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 

Ama başlangıcı: Şu anda hedef tablodaki bunlarla ilgili satır var ve bunların is_visible alan 1 olduğunu notifcations seçilmesi için bu sorguyu kullanıyorum

CREATE TABLE `tablename` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `is_visible` tinyint(1) NOT NULL,  
    `etc` NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 

: Tüm hedef tabloları birkaç benzer sütuna sahip Bir LEFT JOIN, herhangi bir tabloyla eşleşiyorsa, bildirimi döndürür, nasıl yeniden yazabilirim, böylece hedef tablodaki herhangi bir satırla eşleşmeyen bildirimleri döndürmez? CASE ifadesini de denedim.

+0

Sadece "SOL" ve "JOIN" kullanmadan denediniz mi? –

+0

Aşırı derecede titiz bir soru (Ben diğer oyların da olduğunu varsayalım) ve çok kullanışlı bir başlık üzerinde çömelme için aşağı oy. Başlığı yeniden adlandırın ve oylamayı kaldırırım. A'yı A'nın bir kopyası olarak işaretlemek için koşan çok fazla nub var ve bu sadece daha da kötüleştiren bir saçmalık. – John

+0

@John "korkunç kıvrımlı soru"? Soru bana iyi görünüyor. Genelde "downvotes" umurumda değil, ama yararlı sorular ve yapıcı öneriler sormayı umuyorum. Muhtemelen, başlığın kendi sorusu gibi çok genel olduğunu söylemelisiniz. ["Sütun değerine göre farklı veritabanlarından MariaDB JOIN tabloları"?) (Https://stackoverflow.com/questions/48062280/mariadb-join-tables-from-different-databases-based-on-column-value) :) – undefined

cevap

16

Sözdizimin doğru olduğundan ve test etme şansım olmadığından% 100 emin değilim, ama fikir açık olmalı.

SELECT DISTINCT n.id 
FROM notifications n 
JOIN (
    (SELECT b.id, 'book' AS type FROM books b WHERE b.is_visible = 1) 
    UNION 
    (SELECT i.id, 'interview' AS type FROM interviews i WHERE i.is_visible = 1) 
) ids ON n.parent_id = ids.id AND n.parent_type = ids.type 
WHERE n.user_id = 1 
+2

'JOIN' ve' UNION' kullanma hile yapar. Çok teşekkür ederim. – undefined

+0

Teşekkürler! Bana yardımcı oldu! –

İlgili konular