Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
900603
900604
900605
900605
900603
900604
27
30
603
604
605
SELECT
CASE
WHEN MIN( prep.id ) = MAX( prep.id )
THEN MIN( prep.id )
ELSE CONCAT( MIN( prep.id ) , '-', MAX( prep.id ) )
END AS id_range
FROM (
SELECT -- Letzte Gruppe als GruppenId nehmen
@group_id AS group_id, t.id, -- Nächte Gruppe ermitteln
@group_id :=
CASE
WHEN (
CAST( t.id AS UNSIGNED ) +1
) NOT
IN (
SELECT CAST( id AS UNSIGNED )
FROM test
)
THEN @group_id +1-- Die nexte ID exisitert nicht, ergo Gruppen-ID um eins erhöhen
ELSE @group_id -- Due Gruppen-ID bleibt unverändert
END AS next_group_id
FROM (
SELECT @group_id :=1
)vars, test t
)prep
GROUP BY prep.group_id
900603-900605
900605
27-900604
30
603-605
-- Also anstelle von
test t
-- das folgende
(SELECT DISTINCT id FROM test ORDER BY id) t
CREATE TABLE test
(`id` int, `code` varchar(1), `title` varchar(7))
;
INSERT INTO test
(`id`, `code`, `title`)
VALUES
(1, 'A', 'Node 1'),
(2, 'B', 'Node 2'),
(3, 'd', 'Node 3'),
(4, 'D', 'Node 4'),
(5, 'A', 'Node 5'),
(6, 'H', 'Node 6'),
(7, 'I', 'Node 7'),
(8, 'j', 'Node 8'),
(9, 'H', 'Node 9'),
(10, 'A', 'Node 10'),
(11, 9, 'Node 11') -- Dieser Node soll ausgefiltert werden
;
SELECT
grp.code_range,
-- Titel zusammenstellen, sortiert nach der id
GROUP_CONCAT(CONCAT('[', t1.title, ']') ORDER BY t1.id SEPARATOR ', ') AS titles
FROM
test t1,
-- Gruppieren über die group_id und den Range zusammensetzen
(
SELECT
group_id,
CASE
WHEN MIN(prep.code) = MAX(prep.code)
THEN MIN(prep.code)
ELSE CONCAT(MIN(prep.code), '-', MAX(prep.code))
END AS code_range,
GROUP_CONCAT(prep.id_set SEPARATOR ',') AS id_set
FROM
-- Jedem Code eine Gruppen-ID zuweisen
(
SELECT
-- Letzte Gruppe als GruppenId nehmen
@group_id AS group_id,
t.code,
t.id_set,
-- Nächte Gruppe ermitteln
@group_id := CASE
WHEN next_code NOT IN (SELECT UPPER(code) FROM test)
THEN @group_id + 1 -- Die nexte ID exisitert nicht, ergo Gruppen-ID um eins erhöhen
ELSE @group_id -- Due Gruppen-ID bleibt unverändert
END AS next_group_id
FROM
-- Die Variable initialisieren
(SELECT @group_id := 1) vars,
-- Die Daten vorbereiten
(
SELECT
UPPER(code) AS code,
-- Irgend eine Logik, welche den theoretisch nächsten Code ermittelt
CHAR(ASCII(UPPER(code))+1) AS next_code,
-- Set mit allen betroffenen IDS erstellen
GROUP_CONCAT(id SEPARATOR ',') AS id_set
FROM test
WHERE code REGEXP '^[[:alpha:]]$'
GROUP BY code
-- Nach dem Gruppierungs-Code sortieren
ORDER BY code
) t
) prep
GROUP BY
prep.group_id
) grp
WHERE FIND_IN_SET(t1.id, grp.id_set)
GROUP BY grp.group_id
;
CODE_RANGE | TITLES
-----------|----------------------------------------
A-B | [Node 1], [Node 2], [Node 5], [Node 10]
D | [Node 3], [Node 4]
H-J | [Node 6], [Node 7], [Node 8], [Node 9]
SELECT
CASE
WHEN MIN( prep.id ) = MAX( prep.id )
THEN MIN( prep.id )
ELSE CONCAT( MIN( prep.id ) , '-', MAX( prep.id ) )
END AS id_range
FROM (
SELECT -- Letzte Gruppe als GruppenId nehmen
@group_id AS group_id, t.id, -- Nächte Gruppe ermitteln
@group_id :=
CASE
WHEN (
CAST( t.id AS UNSIGNED ) +1
) NOT
IN (
SELECT CAST( id AS UNSIGNED )
FROM test
)
THEN @group_id +1-- Die nexte ID exisitert nicht, ergo Gruppen-ID um eins erhöhen
ELSE @group_id -- Due Gruppen-ID bleibt unverändert
END AS next_group_id
FROM (
SELECT @group_id :=1
)vars, (
SELECT DISTINCT id
FROM test
ORDER BY id
)t
)prep
GROUP BY prep.group_id
$sql = "SELECT lager, regal, hoehe, fach, SUM(meter) as total_meter FROM `weilhammer_datenbank` WHERE lager = '1' AND regal = '1' AND hoehe = '2' AND fach = '1' ";
$result = mysql_query($sql) or die("<b>ERROR: </b>.\n<br />SQL: " . $sql . "<br />\nError: (" . mysql_errno() . ") " . mysql_error());
while($data = mysql_fetch_array($result)) {
echo $data['id_range'].'<br>';
echo $data['lager'].'<br>';
echo $data['regal'].'<br>';
echo $data['hoehe'].'<br>';
echo $data['fach'].'<br>';
echo $data['total_meter'].'<br>';
}
CREATE TABLE IF NOT EXISTS `test` (
`id` int(10) DEFAULT NULL,
`lager` int(3) NOT NULL,
`regal` int(3) NOT NULL,
`hoehe` int(3) NOT NULL,
`fach` int(3) NOT NULL,
`meter` double(3,1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Daten für Tabelle `test`
--
INSERT INTO `test` (`id`, `lager`, `regal`, `hoehe`, `fach`, `meter`) VALUES
(900603, 1, 1, 1, 1, 5.0),
(900604, 1, 1, 1, 1, 1.0),
(900605, 1, 1, 1, 2, 2.0),
(900605, 6, 6, 6, 6, 0.0),
(900603, 3, 3, 2, 1, 1.0),
(900604, 3, 2, 2, 3, 5.0),
(27, 1, 1, 2, 1, 1.0),
(30, 1, 1, 2, 2, 2.0),
(603, 1, 2, 1, 2, 2.0),
(604, 1, 2, 1, 2, 6.0),
(605, 1, 1, 2, 1, 6.0),
(900605, 1, 1, 2, 1, 0.0),
(900603, 1, 1, 2, 1, 0.5),
(900604, 1, 1, 2, 1, 0.0),
(27, 2, 2, 2, 2, 3.0),
(30, 2, 2, 2, 1, 1.0),
(603, 1, 1, 1, 20, 5.0),
(604, 5, 5, 5, 5, 5.0),
(605, 5, 5, 5, 6, 1.0),
(101, 1, 1, 1, 10, 5.0),
(1001, 1, 1, 1, 1, 0.5),
(11, 3, 3, 3, 3, 3.0);
Im Subselect [t] filternZiel ist es:
Suche mir alle id´s die sich im lager 1 im regal 1 in der 2 hoehe im fach 1 befinden.
In dem Fall sind es die id´s 27, 605, 900603, 900604, 900605.
Die Meter ebenfalls im Subselect [t] ausgeben. Dann in jedem GROUIP BY summieren.Folgende id´s befinden sich im lager 1 im regal 1 in der hoehe 2 im fach 1.
27, 605, 900603 - 900605 die Summe der meter = 7,5.
afid_range lagerort gesamtmeter
1-3 [1-2-1-1], [1-2-1-1], [1-2-1-1] 1
5 [1-2-2-1] 10
8-9 [1-2-2-3], [1-2-2-4] 2
CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) DEFAULT NULL,
`afid` int(6) DEFAULT NULL,
`lager` varchar(6) DEFAULT NULL,
`regal` varchar(6) NOT NULL,
`hoehe` varchar(6) NOT NULL,
`fach` varchar(6) NOT NULL,
`meter` varchar(6) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Daten für Tabelle `test`
--
INSERT INTO `test` (`id`, `afid`, `lager`, `regal`, `hoehe`, `fach`, `meter`) VALUES
(1, 1, '1', '2', '1', '1', '1'),
(2, 2, '1', '2', '1', '1', '0'),
(3, 3, '1', '2', '1', '1', '0'),
(4, 5, '1', '2', '2', '1', '10'),
(5, 8, '1', '2', '2', '3', '0.5'),
(6, 9, '1', '2', '2', '4', '1.5'),
(7, 10, '1', '2', '3', '4', '1'),
(8, 11, '1', '2', '3', '4', '1'),
(9, 12, '1', '2', '3', '4', '0'),
(10, 13, '1', '2', '3', '4', '1'),
(11, 20, '1', '2', '4', '1', '1');
SELECT
grp.afid_range,
-- Lager zusammenstellen, sortiert nach der id
GROUP_CONCAT(CONCAT('[', t1.lager,-t1.regal,-t1.hoehe,-t1.fach, ']') ORDER BY t1.id SEPARATOR ', ') AS lagerort,
SUM(meter) AS 'gesamt_meter'
FROM
test t1,
-- Gruppieren über die group_id und den Range zusammensetzen
(
SELECT
group_id,
CASE
WHEN MIN(prep.afid) = MAX(prep.afid)
THEN MIN(prep.afid)
ELSE CONCAT(MIN(prep.afid), '-', MAX(prep.afid))
END AS afid_range,
GROUP_CONCAT(prep.id_set SEPARATOR ',') AS id_set
FROM
-- Jedem Code eine Gruppen-ID zuweisen
(
SELECT
-- Letzte Gruppe als GruppenId nehmen
@group_id AS group_id,
t.afid,
t.id_set,
-- Nächte Gruppe ermitteln
@group_id := CASE
WHEN next_afid NOT IN (SELECT UPPER(afid) FROM test)
THEN @group_id + 1 -- Die nexte ID exisitert nicht, ergo Gruppen-ID um eins erhöhen
ELSE @group_id -- Due Gruppen-ID bleibt unverändert
END AS next_group_id
FROM
-- Die Variable initialisieren
(SELECT @group_id := 1) vars,
-- Die Daten vorbereiten
(
SELECT
UPPER(afid) AS afid,
-- Irgend eine Logik, welche den theoretisch nächsten Code ermittelt
CHAR(ASCII(UPPER(afid))+1) AS next_afid,
-- Set mit allen betroffenen IDS erstellen
GROUP_CONCAT(id SEPARATOR ',') AS id_set
FROM test
WHERE afid REGEXP '^[[:alnum:]]$'
GROUP BY afid
-- Nach dem Gruppierungs-Code sortieren
ORDER BY afid
) t
) prep
GROUP BY
prep.group_id
) grp
WHERE FIND_IN_SET(t1.id, grp.id_set)
GROUP BY grp.group_id