sql >> Databáze >  >> RDS >> Mysql

Jak mohu samostatně počítat a seskupovat sloupce pomocí MySQL?

Vím, že se potýkáte s mnoha věcmi současně, ale nejlepší odpověď řeší problém, který ikegami rychle prošel na cestě k tomu, aby to udělal v Perlu:

Lidé často na úrovni aplikace dělají mnohem více, než potřebují, protože se nikdy nenaučí dělat správné věci v databázi (jako je vaše jiný dotaz což je lépe zodpovězeno vhodným SQL dotazem namísto Perlu). Ale mimochodem, mnoho lidí to dělá, protože nejsou schopni změnit schéma. Sociální heuristika, jako je vhodná aplikace piva, někdy tuto cestu uhladí. Trocha práce s přesvědčováním lidí v databázi se později vyplatí několikanásobně. A jako další stranou, "full stack developer" často opomíjí jakékoli sofistikované použití databází.

Nebudu nikoho nutit číst Databázi do hloubky C.J. Date , ale správné schéma má velkou hodnotu. Po právu mám na mysli, že jeho použití vyžaduje nejmenší úsilí a složitost. Věci by měly být snadné a neměli byste je muset přeskupovat na úrovni aplikace.

Chcete spočítat, kolikrát byla vybrána každá odpověď. Počítání je něco, co databáze umí velmi dobře, tak to nechte dělat databázi.

Máte nějaké otázky. Otázky mají různé odpovědi. Průzkumy seskupují sady otázek. Lidé reagují na průzkumy tak, že své odpovědi spojují s otázkami.

Zde je jednoduchý návrh schématu (a nakonec se objeví nějaký databázový chlapík a řekne mi, že jsem to neudělal správně, ale to je v pořádku). Trik je v tom, že nic nemusí mít více sloupců, které se nepoužívají. Vše přichází v úhledném malém balíčku ("vztah" v "relační databázi"), který lze snadno propojit s ostatními věcmi prostřednictvím "cizích klíčů" (např. question_id pro mapování odpovědi na otázku). Odpovědi budou mít například více řádků pro stejné question_id .

Pokud někdo chce přijít s efektními modelovacími nástroji a udělat obrázek, jděte do toho. Označuji to jako komunitní wiki.

Table: Questions
   id
   text

Table: Answers
   id
   text
   question_id

Table: Surveys
   id 
   title

Table: SurveyQuestionSet
   id
   survey_id
   question_id   

Table: Respondent
   id
   text

Table: Response
   id
   respondent_id
   survey_id
   question_id
   answer_id

Po správném zmapování a normalizaci (přečtěte si o normálních formách ), je velmi snadné získat požadovaná data pomocí SELECTů. Ideálem normalizace je jednoduše neopakovat informace nebo dovolit, aby se dostaly do nekonzistentního stavu. V těchto formách je mnoho věcí mnohem jednodušších.

A pokud si takové věci chcete procvičit, Průzkumník dat Stackoverflow je soubor skutečných dat normalizovaný podle toho, co jsem zde uvedl.

Nyní jednoduše spočítáte, kolikrát answer_id zobrazí se pro konkrétní kombinaci průzkumu a otázky. Jednoduché použití GROUP BY dělá veškerou práci za vás. Už nemusíte procházet řádky a dívat se na desítky nepoužívaných sloupců a snažit se přijít na to, jak je spočítat. Nejen to, ale tyto věci můžete vytvořit zobrazení , což znamená, že dotaz napíšete jednou a databáze předstírá, že jeho výsledky jsou tabulkou. Poté můžete jednoduše dotazovat pohled (takže všechny JOIN s a podobně jsou skryté), což je velmi jednoduché. Uložené procedury jsou také často přehlíženy.



  1. Jak nastavím MySQL dočasně na pouze pro čtení prostřednictvím příkazového řádku?

  2. MySQL – proč neindexovat každé pole?

  3. MariaDB Backup &PostgreSQL v cloudu - ClusterControl Release 1.6.1

  4. Jak dotazovat pole DATETIME pouze pomocí data v Microsoft SQL Server?