Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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=\\"\\\\&quot;\\\\\\\\&quot;faq1_17\\\\\\\\&quot ;\\\\&quot;\\">\r\n <a href=\\"\\\\\\" id=\\"\\\\&quot;\\\\\\\\&quot;faqmysqlversions\\\\ \\\\&quot;\\\\&quot;\\">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&#39;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&#39;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&nbsp;5.1 is not yet supported.</p>\r\n<p>\r\n &nbsp;</p>\r\n<p>\r\n &nbsp;</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.

Předmět Autor Datum
select a.id, a.nazev, case when b.idNewsletter is null then 0 else 1 end from newsletters_ a left ou…
Jan Fiala 17.09.2012 19:22
Jan Fiala
case je v mysql uplne rovnaky. chyba ti za nim uz len alias tohto "pola" - AS checkbox_checked.
wam_Spider007 17.09.2012 19:46
wam_Spider007
Díky vám oběma. Má tedy vypadat dotaz takto? select a.id, a.nazev, case when b.idNewsletter AS chec…
Flash_Gordon 17.09.2012 19:48
Flash_Gordon
to "AS checkbox_checked" ma ist az za prikaz end select a.id, a.nazev, case when b.idNewsletter is…
wam_Spider007 17.09.2012 19:57
wam_Spider007
Na ten case jsem pak zapomnel. Na MS SQL jsem si zvykl na zapis select checkbox_checked=case when b…
Jan Fiala 17.09.2012 20:59
Jan Fiala
Bohužel ten dotaz nefunguje podle popsané představy. Vytahuje pouze skupiny obsažené v obou tabulkác…
Flash_Gordon 18.09.2012 09:39
Flash_Gordon
a si si isty, ze si pouzil LEFT JOIN a nie INNER JOIN?
wam_Spider007 18.09.2012 09:49
wam_Spider007
Toto jsem použil: select a.id, a.nazev, case when b.idNewsletter is null then 0 else 1 end AS check…
Flash_Gordon 18.09.2012 09:54
Flash_Gordon
hmm, tak to spravime nasledovne (kedze nemame nahlad na data): SELECT a.id, a.nazev, case when exis…
wam_Spider007 18.09.2012 09:58
wam_Spider007
díky, ale nedaří se, výstupem je jen skupina, kde je checkbox_checked roven 1. Ostatní skupiny tam n…
Flash_Gordon 18.09.2012 10:01
Flash_Gordon
to bude tou where klauzulou. Trochu si neviem predstavit co potrebujes dosiahnut. Popis sem priklad…
wam_Spider007 18.09.2012 10:03
wam_Spider007
Data v tabulce newsleters_ [http://pc.poradna.net/file/view/10907-tabulka-news letter-png] Data v…
Flash_Gordon 18.09.2012 10:22
Flash_Gordon
aha, takze vazba N:M, to z prveho prispevku jasne nebolo. navyse chces vo vystupe ID a nazvy skupin…
wam_Spider007 18.09.2012 10:53
wam_Spider007
Toto už skutečně funguje ! Děkuji moc. Když budeš potřebovat pomoc s něčím, můžeš se ozvat, ale s M… poslední
Flash_Gordon 18.09.2012 11:10
Flash_Gordon
select a.id, a.nazev, case when b.idNewsletter 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

Tohle je pro MS SQL, nahrad si v prvnim radku nejakoyu konstrukci, ktera v pripade, ze b.idNewsletter neni null vrati 1 nebo TRUE

hmm, tak to spravime nasledovne (kedze nemame nahlad na data):

SELECT
a.id,
a.nazev,
case when exists (select 1 from newsletters_skupiny_hlavni where idNewsletter = a.id) then 1 else 0 end as checkbox_checked
FROM newsletters_ a
WHERE a.id = <nejake_cislo>;

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.

SELECT
a.id,
a.nazev,
case when exists (select 1 from newsletter_skupiny_hlavni where idNewsletter = <tvoje_id_newsletter> and IdSkupina = a.id) then 'check' else null end as checkbox_check
FROM skupina_hlavni a;

Zpět do poradny Odpovědět na původní otázku Nahoru