Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助更正来自两个表的MySQL查询结果吗_Mysql_Sql - Fatal编程技术网

需要帮助更正来自两个表的MySQL查询结果吗

需要帮助更正来自两个表的MySQL查询结果吗,mysql,sql,Mysql,Sql,我有两张表,一张是事件表,一张是时段表。我想在一个查询中选择这两个表数据。这两个表有一个公共字段start_time,我希望结果按该列排序 表的表结构: CREATE TABLE IF NOT EXISTS `events` ( `id` int(11) NOT NULL AUTO_INCREMENT, `event_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `start_time` time NOT NULL, `e

我有两张表,一张是事件表,一张是时段表。我想在一个查询中选择这两个表数据。这两个表有一个公共字段start_time,我希望结果按该列排序

表的表结构:

CREATE TABLE IF NOT EXISTS `events` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `event_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `start_time` time NOT NULL,
  `end_time` time NOT NULL,
  `is_repeated` tinyint(4) NOT NULL DEFAULT '0',
  `alarm_type` enum('set_date','days','monthly') COLLATE utf8_unicode_ci NOT NULL,
  `event_alarm_date` date DEFAULT NULL,
  `alarm_days` set('Sat','Sun','Mon','Tue','Wed','Thu','Fri') COLLATE utf8_unicode_ci DEFAULT NULL,
  `monthly_alarm_days` set('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31') COLLATE utf8_unicode_ci DEFAULT NULL,
  `alarm_audio` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `count_down_time` tinyint(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ;

--
-- Dumping data for table `events`
--

INSERT INTO `events` (`id`, `event_name`, `start_time`, `end_time`, `is_repeated`, `alarm_type`, `event_alarm_date`, `alarm_days`, `monthly_alarm_days`, `alarm_audio`, `created_on`, `count_down_time`) VALUES
(1, 'Lunch Break', '10:30:45', '11:30:45', 1, 'days', NULL, 'Mon,Wed', NULL, '1411587500.mp3', '0000-00-00 00:00:00', 0),
(2, 'Openning Ceremony', '10:30:45', '11:30:45', 1, 'monthly', NULL, NULL, '2,3,4', '1411587568.mp3', '0000-00-00 00:00:00', 0),
(3, 'Inspection', '10:30:45', '12:45:30', 0, 'set_date', '2014-09-26', NULL, NULL, '1411587695.mp3', '0000-00-00 00:00:00', 0),
(5, 'Test2', '10:30:45', '11:30:45', 1, 'monthly', NULL, NULL, '3,4,5', '1411595801.mp3', '2014-09-24 21:56:41', 0),
(6, 'Test3', '22:20:30', '23:25:30', 1, 'days', NULL, 'Sun,Mon', NULL, '1411597086.mp3', '2014-09-24 22:18:06', 0);

CREATE TABLE IF NOT EXISTS `periods` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `period_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `start_time` time NOT NULL,
  `repeat_on` set('Sat','Sun','Mon','Tue','Wed','Thu','Fri') COLLATE utf8_unicode_ci DEFAULT NULL,
  `count_down_time` tinyint(4) NOT NULL DEFAULT '40',
  `created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `period_audio` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

--
-- Dumping data for table `periods`
--

INSERT INTO `periods` (`id`, `period_name`, `start_time`, `repeat_on`, `count_down_time`, `created_on`, `period_audio`) VALUES
(1, 'Quran Recitation', '08:15:00', 'Mon,Wed', 30, '2014-09-25 01:30:26', ''),
(2, 'Morning Assembly', '08:15:00', 'Sun,Mon,Wed', 30, '2014-09-28 04:25:24', '');
我在下面写下了我的疑问。这个查询得到8条记录,而根据表数据,它应该得到5条记录

SELECT pr.period_name, 
     pr.start_time as period_start_time, 
     pr.repeat_on, pr.created_on as period_created_on, 
     pr.count_down_time as period_count_down_time, 
     pr.period_audio, ev.event_name, 
     ev.start_time as event_start_time, 
     ev.end_time as event_end_time, 
     ev.is_repeated, ev.alarm_type, 
     ev.event_alarm_date,ev.alarm_days, 
     ev.monthly_alarm_days, 
     ev.alarm_audio, 
     ev.created_on as event_created_on, 
     ev.count_down_time as event_count_down_time 
 FROM periods as pr, events as ev  
 WHERE 
    FIND_IN_SET('Mon',repeat_on)>0 AND

    CASE alarm_type WHEN 'set_date' THEN FIND_IN_SET('2014-09-25',event_alarm_date)>0 
                        WHEN 'days' THEN FIND_IN_SET('Mon',alarm_days) > 0 
                        WHEN 'monthly' THEN FIND_IN_SET('2',monthly_alarm_days) > 0 
        END = 1
  ORDER BY pr.start_time AND ev.start_time

感谢您的帮助。

您的选择中没有加入条件。请更好地描述预期结果集。这些表是如何关联的?实际上,从它们的结构中可以看出,这些表并不相关,但我想使用一个查询来选择它们的数据。我还想把句点名称和事件名称作为一列来读取,而开始时间列也是这样。因此,当我循环遍历结果时,我将读取一列周期名称和事件名称,以及一列开始时间。所以在第页,我将使用循环来显示周期和事件。如果表不相关,那么使用公共选择来包含两者将不会像您所想的那样起作用。当您按原样构造select时,一个六行和两行表将生成一个十二行结果6x2=12。where子句中的case语句限制事件中的两行显示,从而创建八行结果集2x4=8。如果行与您建议的不相关,您可能需要研究联合语法。ORDER BY pr.start_time和ev.start_time将AND视为布尔运算符。它的计算结果可能是按“1”排序,这没有任何用处。