MySQL dotaz
Ahoj.
Nedaří se mi pořešit specielní sql dotaz.
Už jste mi dvakrát úspěšně pomohli.
Mám 2 tabulky.
první se jmenuje:
newsletters_
A obsahuje
id a nazev
Potom mám druhou tabulku newsletters_skupiny_hlavni, která obsahuje sloupce čísla:
idNewsletter a
idSkupiny
A já chci vytáhnout dotazem:
- všechny id a nazev z newsletters_, přičemž bude výsledek obsahovat ještě navíc sloupec checkbox_checked, který bude nenulový v případech, kdy se id z newsletters_ shoduje s idNewsletter v tabulce newsletters_skupiny_hlavni.
Navíc potřebuji, aby to celé bylo podmíněno jen pro konkrétní newsletters_.id
Zatím jsem došel sem:
SELECT id, nazev, NSH.idNewsletter checkbox_checked FROM skupina_hlavni LEFT JOIN newsletters_skupiny_hlavni NSH ON NSH.idNewsletter = skupina_hlavni.id where coalesce(NSH.idNewsletter, 8 ) = 8 group by id
Nicméně někde je chyba a ve sloupci checkbox_checked nefigurují řádně všechny potřebné hodnoty.
Zde přikládám příkazy pro vytvoření tabulky s testovacími daty:
--
-- Struktura tabulky `newsletters_skupiny_hlavni`
--
CREATE TABLE IF NOT EXISTS `newsletters_skupiny_hlavni` (
`idNewsletter` int(11) unsigned NOT NULL,
`idSkupiny` int(11) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Obsahuje vazbu mezi ID newsletteru a ID skupiny';
--
-- Vypisuji data pro tabulku `newsletters_skupiny_hlavni`
--
INSERT INTO `newsletters_skupiny_hlavni` (`idNewsletter`, `idSkupiny`) VALUES
(8, 8),
(8, 6),
(2, 5);
Druhá tabulka:
-- Struktura tabulky `newsletters_`
--
CREATE TABLE IF NOT EXISTS `newsletters_` (
`id` int(10) unsigned NOT NULL auto_increment,
`nazev` varchar(100) collate cp1250_czech_cs NOT NULL,
`datum_v_letaku` varchar(10) collate cp1250_czech_cs NOT NULL,
`text` text collate cp1250_czech_cs NOT NULL,
`datum_expirace` date NOT NULL,
`datum_odeslan` date NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs AUTO_INCREMENT=9 ;
--
-- Vypisuji data pro tabulku `newsletters_`
--
INSERT INTO `newsletters_` (`id`, `nazev`, `datum_v_letaku`, `text`, `datum_expirace`, `datum_odeslan`) VALUES
(6, 'pokusný newsletter', '20.12.2012', '<h4 id=\\"\\\\"\\\\\\\\"faq1_17\\\\\\\\" ;\\\\"\\">\r\n <a href=\\"\\\\\\" id=\\"\\\\"\\\\\\\\"faqmysqlversions\\\\ \\\\"\\\\"\\">1.17 Which MySQL versions does phpMyAdmin support?</a></h4>\r\n<p>\r\n All MySQL versions from 3.23.32 till 5.0 (except for 4.1.0 and 4.1.1) are fully supported. Please note that the older your MySQL version is, the more limitations you will have to face.<br />\r\n phpMyAdmin may connect to your MySQL server using php's classic <a href=\\"\\\\\\">MySQL extension</a> as well as the <a href=\\"\\\\\\">improved MySQL extension (MySQLi)</a> that is available in php 5.0.<br />\r\n Either way, the developers of both extensions recommend to use the classic extension for MySQL 4.0 and below and MySQLi for MySQL 4.1 and newer.<br />\r\n When compiling php, we strongly recommend that you manually link the MySQL extension of your choice to a MySQL client library of at least the same minor version since the one that is bundled with some php distributions is rather old and might cause problems <a href=\\"\\\\\\"> (see <abbr asked=\\"\\" title=\\"\\\\\\\\\\">FAQ</abbr> 1.17a)</a>. If your webserver is running on a windows system, you might want to try MySQL's <a connector=\\"\\" dev.mysql.com=\\"\\" downloads=\\"\\" href=\\"\\\\\\\\\\" http:=\\"\\" php=\\"\\">Connector/PHP</a> instead of the MySQL / MySQLi extensions that are bundled with the official php Win32 builds.<br />\r\n MySQL 5.1 is not yet supported.</p>\r\n<p>\r\n </p>\r\n<p>\r\n </p>\r\n', '2012-09-20', '0000-00-00'),
(2, 'pokusny nazev', '22.3.2014', 'teext', '2012-09-11', '2012-09-09'),
(5, 'Název newsletteru:', '14-09-2012', '<p>\r\n text</p>\r\n', '0000-00-00', '0000-00-00'),
(8, 'I Wanna rock renamed', '20.12.2012', '<h4>\r\n MŮJ NADPIS</h4>\r\n', '2016-01-20', '0000-00-00');
Díky všem, kteří to dočetli až sem.
Tohle je pro MS SQL, nahrad si v prvnim radku nejakoyu konstrukci, ktera v pripade, ze b.idNewsletter neni null vrati 1 nebo TRUE
case je v mysql uplne rovnaky. chyba ti za nim uz len alias tohto "pola" - AS checkbox_checked.
Díky vám oběma. Má tedy vypadat dotaz takto?
select a.id, a.nazev, case when b.idNewsletter AS checkbox_checked is null then 0 else 1 end
from newsletters_ a
left outer join newsletters_skupiny_hlavni b on a.id=b.idNewsletter
where a.id = 12
Bohužel ještě dnes si to nemůžu odzkoušet.
to "AS checkbox_checked" ma ist az za prikaz end
select a.id, a.nazev, case when b.idNewsletter is null then 0 else 1 end AS checkbox_checked
from newsletters_ a
left outer join newsletters_skupiny_hlavni b on a.id=b.idNewsletter
where a.id = 12
Na ten case jsem pak zapomnel. Na MS SQL jsem si zvykl na zapis
pak jsem si uvedomil, ze to MySQL nezna a chtel jsem to prepsat na as checkbox_checked a zapomnel jsem
Bohužel ten dotaz nefunguje podle popsané představy.
Vytahuje pouze skupiny obsažené v obou tabulkách zároveň.
Ale já potřebuji všechny skupiny z newsletters_, přičemž ty společně obsažené v newsletters_skupiny_hlavni by měly mít checkbox_checked.
a si si isty, ze si pouzil LEFT JOIN a nie INNER JOIN?
Toto jsem použil:
select a.id, a.nazev, case when b.idNewsletter is null then 0 else 1 end AS checkbox_checked
from newsletters_ a
left outer join newsletters_skupiny_hlavni b on a.id=b.idNewsletter where a.id=8
A výstupem je pouze jedna skupina a to ještě dablovaná, což je také nežádoucí.
hmm, tak to spravime nasledovne (kedze nemame nahlad na data):
díky, ale nedaří se, výstupem je jen skupina, kde je checkbox_checked roven 1.
Ostatní skupiny tam nejsou.
to bude tou where klauzulou. Trochu si neviem predstavit co potrebujes dosiahnut.
Popis sem priklad dat z jednej tabulky, priklad dat z druhej tabulky a potom priklad vystupu.
Ja sa ti na to pokusim spravit select.
Data v tabulce newsleters_
Data v tabulce tabulka-newsletter-skupiny-hlavni
A data v tabulce skupina hlavní:
A výstupem má být něco takovéhoto pro id newsletteru rovno 8
Prostě tabulka newsletter_skupiny_hlavni obsahuje vazby mezi ostatníma dvěma.
aha, takze vazba N:M, to z prveho prispevku jasne nebolo. navyse chces vo vystupe ID a nazvy skupin a nie newsletterov. Cize to bude trochu opacne.
Toto už skutečně funguje !
Děkuji moc. Když budeš potřebovat pomoc s něčím, můžeš se ozvat, ale s Macem a Apple nejsem příliš kamarád.