IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
kxmx
Tvůrce
Avatar
kxmx:29.7.2016 14:47

Zdravím, potřeboval bych poradit s dotazem.

Tento dotaz dělá co má, vybere zařízení která spadají pod určitou akci podle toho pod jakou scénou akce jsou.

SELECT devices.id, devices.ip, devices.name, programs.stop, programs.step, programs.delay, actions.id
FROM devices

LEFT JOIN actions_devices ON actions_devices.device = devices.id
LEFT JOIN actions ON actions.id = actions_devices.action
LEFT JOIN programs ON programs.id = actions.program

WHERE actions_devices.action IN (SELECT id FROM actions WHERE scene = 1);

I tento dotaz dělá co má, vybere zařízení ve skupině spadající pod akci podle scény.

SELECT DISTINCT devices.id, devices.ip, devices.name, programs.stop, programs.step, programs.delay, actions.id
FROM devices

LEFT JOIN actions_devices ON actions_devices.device = devices.id
LEFT JOIN devices_groups ON devices_groups.device = devices.id
LEFT JOIN actions_groups ON actions_groups.group = devices_groups.group
LEFT JOIN actions ON actions.id = actions_groups.action
LEFT JOIN programs ON programs.id = actions.program

WHERE actions_groups.action IN (SELECT id FROM actions WHERE scene = 1);

A já bych tyto dva dotazy potřeboval zkombinovat, abych vybral všechna zařízení, která jsou buď samostatně nebo ve skupině spadající pod akci, která je ve scéně.

Bohužel pouhý logický součet nestačí, dostávám nazpět zařízení ze všech akcí, ve kterých se vyskytuje skupina z where podmínky.

SELECT devices.id, devices.ip, devices.name, programs.stop, programs.step, programs.delay
FROM devices

LEFT JOIN actions_devices ON actions_devices.device = devices.id
LEFT JOIN devices_groups ON devices_groups.device = devices.id
LEFT JOIN actions_groups ON actions_groups.group = devices_groups.group
LEFT JOIN actions ON (actions.id = actions_devices.action OR actions.id = actions_groups.action)
LEFT JOIN programs ON programs.id = actions.program

WHERE
actions_devices.action IN (SELECT id FROM actions WHERE scene = 1) OR
actions_groups.action IN (SELECT id FROM actions WHERE scene = 1)

Případným fajnšmejkrům dávám k dispozici strukturu databáze. Předem díky za rady.
databaze.sql

 
Odpovědět
29.7.2016 14:47
Avatar
Vít Pleskot
Člen
Avatar
Vít Pleskot:9.8.2016 10:30

No chtel jsem se na to podivat, ale soubor je pristupny jen na pozadani a i pres pozadani, jsem pravo neobdrzel, takze jen takhle od oka nestacilo by ty dva vystupy spojit pres UNION (ALL) ?

 
Nahoru Odpovědět
9.8.2016 10:30
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.