MySQL error: Subquery returns more than one row (využití pro Grafanu)

Ahoj, potřebuji z databáze s měřením hodnot získat data pro Grafanu s měsíční periodou. Mám 2 situace, buď získávám data pro jednu veličinu(komoditu) nebo pro skupinu takových veličin(komodit). Zda se jedná o jednotlivou veličinu nebo skupinu si ukládám jiným dotazem do proměnné $commodities , krterá nabývá hodnot např (1, 2, 3 .... ) = pro jednotlivé veličiny a např. (1grp, 2grp, 3grp ...) = pro skupiny veličin.

Tak abych dotaz mohl použít v grafaně potřebuji mít obě situace v jednom dotazu, nicméně dotaz končí chybou protože vrací více řádků pro subdotaz, samostatně dotazy v case fungují a zobrazí dané hodnoty pro každý z dvanácti měsíců. Nenapadlo by prosím někoho jak situaci řešit? Předem díky

Kód: [Vybrat]
SELECT
measurement.period AS "time",
2020 AS "metric",
  (CASE
    WHEN '$commodities' LIKE '%grp%'
    THEN (SELECT
      SUM(m.value) AS "value"
      FROM group_commodity as g, measurement as m, connection as c
      WHERE g.group_id = REPLACE('$commodities', 'grp', '')
      AND c.group_id = g.group_id
      AND m.commodity_id = c.commodity_id
      AND YEAR(m.period) = 2020
      GROUP BY m.period)
    ELSE (SELECT
      value
      FROM measurement, commodity
      WHERE measurement.commodity_id = commodity.commodity_id
      AND measurement.commodity_id = $commodities
      AND YEAR(period) = 2020
      ORDER BY measurement.period)
  END) as "value"
FROM measurement
WHERE
YEAR(period) = 2020


Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Pokud Ti subselect vrací více hodnot, tak ho "neselekti", ale "joini"
Kód: [Vybrat]
SELECT mesaurement.*, table.* FROM measurement JOIN
(TVUJ SILENEJ SELECT
) ON (....)
Ale celej ten dotaz je zřejmě ještě nějak blbě, protože tam máš tabulku measurement dvakrát (v subselectu i hlavním selectu) a ten measurement v hlavním selectu neni vlastně použitej....

Pokud Ti subselect vrací více hodnot, tak ho "neselekti", ale "joini"
Kód: [Vybrat]
SELECT mesaurement.*, table.* FROM measurement JOIN
(TVUJ SILENEJ SELECT
) ON (....)
Ale celej ten dotaz je zřejmě ještě nějak blbě, protože tam máš tabulku measurement dvakrát (v subselectu i hlavním selectu) a ten measurement v hlavním selectu neni vlastně použitej....

Jo, máš pravdu, v tom hlavním selectu je ta tabulka measurement blbě. Rozdělím to na dvě části a budu ty jednotlivý veličiny a skupiny zpracovávat odděleně.

Tak jsem to nakonec díky nápadu z jiné diskuse vyřešil pomocí UNION.

Kód: [Vybrat]
SELECT
      SUM(m.value) AS "value",
      m.period AS "time",
      DATE_FORMAT(NOW(), '%Y') AS "metric"
      FROM group_commodity as g, measurement as m, connection as c
      WHERE g.group_id = IF ('$commodities' LIKE '%grp', REPLACE('$commodities', 'grp', ''), '0')
      AND c.group_id = g.group_id
      AND m.commodity_id = c.commodity_id
      AND YEAR(m.period) = 2020
      GROUP BY m.period
UNION
SELECT
      measurement.value AS "value",
      measurement.period AS "time",
    DATE_FORMAT(NOW(), '%Y') AS "metric"
      FROM measurement, commodity
      WHERE measurement.commodity_id = commodity.commodity_id
      AND measurement.commodity_id = IF ('$commodities' LIKE '%grp', '0', '$commodities')
      AND YEAR(period) = 2020