【问题标题】:what sql query statement should i use for a vb.net application?我应该为 vb.net 应用程序使用什么 sql 查询语句?
【发布时间】:2011-11-07 16:25:00
【问题描述】:

我在 MySQL 数据库中设置了三个表,分别称为“事件”、“状态”和“用户”。 (如下图:

事件表(下)

状态表(下)

用户表(下)

当我从事件表中获取数据时,我使用下面的 SQL 查询语句将人员的名字和姓氏绑定在一起作为一个名为“name”的变量,然后将该名称绑定到相应的 user_id;等等。但是,当我对事件表进行更改时,它不会显示我所做的更改。我确定这与我检索数据的方式有关。

SELECT CONCAT(u.lastname, ', ', u.firstname) AS Name
       , s.message AS Message
       , DATE_FORMAT(e.timestamp,'%b %d %Y - %r') AS DateTime
       , e.status AS Status 
FROM event e 
LEFT JOIN status s ON e.message_id = s.message_id
          , user u 
WHERE(e.user_id = u.user_id)
  AND event_id IN(
      SELECT MAX(e.event_id) FROM event e 
      GROUP BY e.user_id)
ORDER BY name

所以我需要一个新的 SQL 查询语句,它将获取这三个表中的信息,并在我的 vb.net 程序中生成一个类似于以下内容的数据网格视图:

但也将接受我通过我的 vb.net 程序中的数据网格视图对数据库所做的任何更改;或者如果我的问题与查询语句无关,那么我想知道如何解决这个问题。

如果您想查看我的数据库的基本布局(减去个人信息),那么这里是我的数据库的脚本。

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `in_out`;
USE `in_out`;
CREATE TABLE `admin_levels` (
  `level_id` tinyint(3) unsigned NOT NULL auto_increment,
  `title` char(20) NOT NULL default '',
  PRIMARY KEY  (`level_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `event` (
  `event_id` mediumint(8) unsigned NOT NULL auto_increment,
  `user_id` smallint(5) unsigned NOT NULL default '0',
  `message_id` mediumint(8) unsigned default '0',
  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `status` enum('In','Out') NOT NULL default 'In',
  `creator` smallint(5) unsigned default NULL,
  PRIMARY KEY  (`event_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `event` (`event_id`,`user_id`,`message_id`,`timestamp`,`status`,`creator`) VALUES 
 (1,1,1,'2005-01-17 11:50:00','Out',1),
 (2,2,1,'2005-01-17 11:57:00','Out',2),
 (3,3,1,'2005-01-17 11:59:00','Out',3),
 (4,1,3,'2005-01-17 13:30:00','In',1),
 (5,2,3,'2005-01-17 13:30:00','In',2),
 (6,3,3,'2005-01-17 13:30:00','In',3),
 (7,2,2,'2005-01-17 16:00:00','Out',2),
 (8,3,2,'2005-01-17 16:10:00','Out',3),
 (9,1,NULL,'2005-01-17 15:19:49','In',1);
CREATE TABLE `groups` (
  `group_name` char(20) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `scope` enum('Public','Private') default NULL,
  `deleted` enum('True','False') default NULL,
  PRIMARY KEY  (`group_name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `status` (
  `message_id` mediumint(8) unsigned NOT NULL auto_increment,
  `user_id` smallint(5) unsigned default NULL,
  `message` char(255) NOT NULL default '',
  `deleted` enum('True','False') default NULL,
  PRIMARY KEY  (`message_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `status` (`message_id`,`user_id`,`message`,`deleted`) VALUES 
 (1,NULL,'Gone to Lunch','False'),
 (2,NULL,'Gone For The Day','False'),
 (3,NULL,'In Meeting','False');
CREATE TABLE `user` (
  `user_id` int(10) unsigned NOT NULL auto_increment,
  `lastname` char(40) NOT NULL default '',
  `firstname` char(40) NOT NULL default '',
  `phone` char(10) NOT NULL default '',
  `username` char(16) NOT NULL default '',
  `password` char(40) character set latin1 collate latin1_bin NOT NULL default '',
  `administrator` enum('TRUE','FALSE') NOT NULL default 'TRUE',
  `deleted` enum('TRUE','FALSE') NOT NULL default 'TRUE',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `user` (`user_id`,`lastname`,`firstname`,`phone`,`username`,`password`,`administrator`,`deleted`,`created`) VALUES 
 (1,'Hillyer','Mike','4033806535','mike','12345','TRUE','FALSE','2004-11-27 11:41:00'),
 (2,'Jones','Tom','4035551212','bob','54321','FALSE','FALSE','2005-01-17 13:52:00'),
 (3,'Johnson','Julie','4035551213','julie','weakpass','FALSE','FALSE','2005-01-17 13:55:00');
CREATE TABLE `user_group` (
  `group_name` char(20) NOT NULL default '',
  `user_id` smallint(5) unsigned NOT NULL default '0',
  `level_id` tinyint(3) unsigned default NULL,
  PRIMARY KEY  (`user_id`,`group_name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

【问题讨论】:

  • 结合显式 SQL '92 和隐式 SQL '89 连接语法,这是第一次!它几乎闪耀在它的丑陋中。
  • 请不要链接到像megaupload这样的蹩脚下载网站。只要 SO 不抱怨帖子太长,最好只发布数据。
  • 哦,-1,对于粘贴图片,您可以粘贴可复制粘贴的文本,使用 megaupload 并混合 SQL '89 和 SQL '92 语法。
  • 好吧,首先我不知道有比megaupload 更好的网站,因此我别无选择(据我所知)。其次,什么是“SO”?最后,没有冒犯,但我希望得到建议/帮助而不是批评......
  • SQL '89 语法:select a.*, b.* from a,b where a.id = b.a_id 使用隐式连接。 SQL '92 语法 select a.*, b.* from a inner join b ON a.id = b.a_id 使用显式连接。这将连接条件与过滤条件分开,使您的查询更容易调试。

标签: mysql sql vb.net


【解决方案1】:

试试这个

 SELECT CONCAT(u.lastname + ', ' + u.firstname) AS Name
   , s.message AS Message
   , DATE_FORMAT(e.timestamp,'%b %d %Y - %r') AS DateTime
   , e.status AS Status 
FROM event e 
LEFT JOIN status s ON e.message_id = s.message_id inner join user u on e.user_id = u.user_id

WHERE event_id IN(
  SELECT MAX(e.event_id) FROM event e 
  GROUP BY e.user_id)
ORDER BY name

【讨论】:

  • 也将其保存为 sqlserver 中的存储过程并用作应用程序中的数据源,并且您在 sql 中所做的每项更改都应显示
  • 我假设存储过程您的意思是 mysql 工作台中的例程,您的意思是将其添加到例程列表中还是实际将其保存在我的计算机上并在 Visual Basic Express 中导入。另外,我如何将其用作数据源?它没有出现在列表中...
【解决方案2】:

请像这样重写查询。

SELECT CONCAT(u.lastname, ', ', u.firstname) AS Name
       , s.message AS Message
       , DATE_FORMAT(e.`timestamp`,'%b %d %Y - %r') AS DateTime
       , e.status AS Status 
FROM event e 
LEFT JOIN status s ON e.message_id = s.message_id
INNER JOIN user u ON (e.user_id = u.user_id)
WHERE e.event_id IN(
      SELECT MAX(e.event_id) FROM event e 
      GROUP BY e.user_id)
ORDER BY name

但是,当我对事件表进行更改时,它不会显示我所做的更改。我确定这与我检索数据的方式有关

为什么我没有看到我对 event 表所做的任何更改?

我认为您希望在数据视图中显示上述查询的输出,并将数据输入该视图。
对于不是由简单查询以外的任何东西提供的视图,最后一件事是不可能的,例如:

SELECT * FROM table1   

原因是 SQL 不知道如何放置使用的表中的数据,也不想知道。

如果您对event 表本身进行了更改,那么当您重新运行查询时,您当然会看到这些更改并且如果它们符合select 语句中的条件。

【讨论】:

  • 所以如果我不能使用你上面修改过的sql查询并更新数据,那么你建议什么解决方案?是的,我想查看上述查询的输出,当我在该视图中输入数据时,难道我不能反向执行整个过程吗?解绑姓名,将其拆分为名字和姓氏,将消息与其 id 分开等等?
  • 你说“......对于一个除了简单查询之外没有任何东西提供的视图......”我还能提供什么?
  • 我想要做的就是使用 vb.net 客户端程序在我的数据库中显示和更改信息
  • @daniel,你不能这样做,如果你想提供它,你必须进行查询以提供数据库INSERT INTO event (user_id, message_id, timestamp, status, creator) VALUES (345, 54545, NOW(), 0,0)。您不能创建查询 select * from x 除外) 并期望它可以双向工作。 SQL 不是千里眼。
  • @daniel,顺便说一句,一个简单的查询 = select * from x 其他任何事情都不够简单,无法双向工作。
猜你喜欢
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 2017-06-08
  • 2014-09-19
相关资源
最近更新 更多