sql >> Databasteknik >  >> RDS >> Mysql

Mysql json-baserad implementering av trendtaggar

Jag ser ingen bra anledning till varför du använder JSON här. Det är inte heller klart varför du tror att ett "nosql-schema " inom MySQL skulle göra allt bättre.

Vad du förmodligen behöver är något sånt här:

CREATE TABLE TAG_COUNTER (
    account       varchar(36) NOT NULL,
    time_id       INT NOT NULL,
    tag_name      varchar(50) NOT NULL,
    counter       INT UNSIGNED NOT NULL,
    PRIMARY KEY   (account, time_id, tag_name)
);

Detta kommer att förenkla dina frågor. INSERT-satsen skulle se ut så här:

INSERT INTO TAG_COUNTER
  (account, time_id, tag_name, counter)
VALUES
  ('google', 2018061023, 'tag1', 1),
  ('google', 2018061023, 'tag2', 1)
ON DUPLICATE KEY UPDATE counter = counter + VALUES(counter);

SELECT-satsen kan vara ungefär så här

SELECT
    SUBSTRING(time_id, 1, 6) AS month,
    tag_name,
    SUM(counter) AS counter_agg
FROM TAG_COUNTER
GROUP BY month, tag_name
ORDER BY month, counter_agg DESC;

Observera att jag inte försökte optimera tabellen/schemat för datastorlek och prestanda. Det vore en annan fråga. Men du måste se att frågorna är mycket enklare nu.



  1. Hur får man nästa/föregående rekord i MySQL?

  2. SQL för att hitta det första icke-numeriska tecknet i en sträng

  3. Hur hämtar man data från 2 tabeller?

  4. JDBC ResultSet:Jag behöver en getDateTime, men det finns bara getDate och getTimeStamp