Select zaznamu s historii – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Select zaznamu s historii – MySQL – Fórum – Programujte.comSelect zaznamu s historii – MySQL – Fórum – Programujte.com

 

peter
~ Anonymní uživatel
4016 příspěvků
24. 11. 2016   #1
-
0
-

Potrebuji udelat historii zaznamu, jak na to?

Mam zhruba 2 napady.
1. 

CREATE TABLE IF NOT EXISTS `nz_index` (
  `id_index`  int(10) unsigned NOT NULL auto_increment,
  `id_table`  int(10) unsigned DEFAULT NULL,
  `id_row`    int(10) unsigned DEFAULT NULL,
  PRIMARY KEY  (`id_index`),
  INDEX `id_table` (`id_table`),
  INDEX `id_row` (`id_row`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Vest 3 tabulky, pomocne tab. tables a index. Tables seznam id_table, name, Index se seznamem zaznamu, id_radku v tabulce id_table.
V tabulce data (id_table) bude id_radku (primary), id_index, data.
INSERT:
- insert do tab. data -> id_row;
- insert do tab. index: id_table -> id_index
- update do tab. data: id_index
UPDATE:
- insert do tab. data: id_index -> id_row
- update do tab. index: id_row
SELECT jen posledni zaznamy
- select z tab. index LEFT JOIN tab. data, id_row
(cili, posledni upraveny zaznam bude v tabulce index, id radku z tabulky data)
SELECT historie zmen pro dany radek
- select z tab. data group by id_index
 

2.  

CREATE TABLE IF NOT EXISTS `nz_forms` (
  `id_form`  int(10) unsigned NOT NULL auto_increment,
  `id_formgroup` int(10) unsigned DEFAULT NULL,
  `data`    varchar(40) DEFAULT NULL,
  `time`     datetime DEFAULT NULL,
  PRIMARY KEY  (`id_form`),
  INDEX `id_formgroup` (`id_formgroup`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Cili, vest jen tabulku se zaznamy.
Jenze tam nevim, jak ziskat jen SELECT poslednich zaznamu.

Pripadne ted resim jeste jeden program, a tam bych potreboval SELECT takovy, aby slo filtrovat treba podle nazvu, ale byli tam vsechny zaznamy i se zmenami, zmeny u sebe. (konkretne je to seznam inet-zasuvek na budove a potrebujeme jako admini vedet, kdo tam delal zmeny a jake, kdy, js vypada asi takto, data hashovana http://mlich.zam.slu.cz/…uvky-csv.htm)
id, id_root, jmeno, prijmeno, time
1, 1, Tonda, Kucra, 0 (casove razitko, pro jednoduchost pouziji male cislo)
2, 1, Tonda, Kucera, 2 (upraven zaznam id=1 v case 2)
3, 3, Matej, Slama, 1

A ted bych to chtel seradit podle prijmeni DESC, ale aby prvni radek byla posledni zmena
3, 3, Matej, Slama, 1
2, 1, Tonda, Kucera, 2 (nejnovejsi)
1, 1, Tonda, Kucra, 0 (starsi -1)
x, 1, ..., ... (starsi -2 ...)

A nebo opacne, aby posledni zmena byla na konci
3, 3, Matej, Slama, 1
x, 1, ..., ... (starsi -2 ...)
1, 1, Tonda, Kucra, 0 (starsi -1)
2, 1, Tonda, Kucera, 2 (nejnovejsi)

Jak na to? Co je lepsi? Pripadne, jak udelat selecty, update, insert?

Nahlásit jako SPAM
IP: 2001:718:2601:26c:18f6:fd...–
peter
~ Anonymní uživatel
4016 příspěvků
24. 11. 2016   #2
-
0
-

u te jednotabulkove verze, [2.],  by to mozna slo udelat jeste tak, ze pridam k datumu i cislo revize, jakoze

id, id_root, jmeno, prijmeno, time, revize
3, 3, Matej, Slama, 1, 0
2, 1, Tonda, Kucera, 2, 2 (nejnovejsi)
1, 1, Tonda, Kucra, 1, 1 (starsi -1)
x, 1, ..., ..., 0, 0 (starsi -2 ...)

pak udelam 1 select s id, id_root, COUNT(id) revize_max GROUP BY id_root
a nad tim udelam select, ktery to propoji pres LEFT JOIN na id_root=id_root AND revize = revize_max. Pak bych dostal seznam jen nejnovejsich zaznamu.
Horsi, kdyby mi nekdo nejaky z radku smazal :) Mozna misto COUNT pouzit MAX(revize) nebo MAX(time).

Mno, a tu [3.], ten seznam inet-zasuvek, tam by se to dalo mozna nejak najoinovat. By se to muselo nejdriv podobne vyfiltrovat, pridat sloupce, podle kterych se serazuje, seradit a pak k tomu nejak najoinovat ostatni revize, asi. Nevim, zatim

Nahlásit jako SPAM
IP: 2001:718:2601:26c:18f6:fd...–
peter
~ Anonymní uživatel
4016 příspěvků
25. 11. 2016   #3
-
0
-

Ta [2.] vypada konkretne nejak takhle
 

CREATE TABLE IF NOT EXISTS `nz_forms` (
  `id_form` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_root` int(10) unsigned DEFAULT NULL,
  `status` int(10) unsigned DEFAULT NULL,
  `name0` varchar(40) DEFAULT NULL,
  `name1` varchar(40) DEFAULT NULL,
  `name2` varchar(40) DEFAULT NULL,
  `name3` varchar(40) DEFAULT NULL,
  `time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_form`),
  KEY `id_group` (`status`),
  KEY `id_root` (`id_root`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;

--
-- Dumping data for table `nz_forms`
--

INSERT INTO `nz_forms` (`id_form`, `id_root`, `status`, `name0`, `name1`, `name2`, `name3`, `time`) VALUES
(1, 1, 1, 'aaa 0xyyy', 'bbb 0xx', 'ccc 0xs', 'ddd 0xa', '2016-11-25 09:20:59'),
(3, 1, 0, 'ddd', 'ddd', 'ddd', 'ddd', '2016-11-25 12:26:54'),
(4, 1, 1, 'ddd', 'ddd', 'ddd', 'ddd 0xa', '2016-11-25 09:29:59'),
(5, NULL, 2, 'fsd', 'fds', 'xxxxxxa', 'xxxxxxa', '2016-11-25 09:21:59');

			$pref = '`b`.';
			$query_inner = "
  SELECT 
    IF(c.`id_root` IS NOT NULL, c.`id_root`,c.`id_form`) AS `id_root`,
    Max(c.`time`) AS `time` 
  FROM `$tbl` c
  GROUP BY c.`id_root`
";
			$query1  = "SELECT COUNT(*) AS 'count' FROM ($query_inner) AS ".$pref.$where2;
//			$query2  = "SELECT $query_keys FROM `$tbl`".$where2;
			$query2  = "
SELECT $query_keys 
FROM ($query_inner) AS `a`
  LEFT JOIN `$tbl` `b` ON (`b`.`id_root`=`a`.`id_root` OR `b`.`id_form`=`a`.`id_root`) AND `b`.`time`=`a`.`time` 
".$where2;
			$query2 .= " ORDER BY ".$pref.$SQL->escapeKey($table_order)." LIMIT $table_start, $table_count";
Nahlásit jako SPAM
IP: 2001:718:2601:26c:4595:d8...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý