用于在列中显示行数据的SQL

man*_*amz 20 php mysql

这是我的sql(在mysql表中)

select * from(SELECT sample_register.usin,    
                     DATE_FORMAT(sample_register.doc,'%d-%m-%Y') as doc1,    
                     sample_register.location,    
                     sample_register.description,    
                     sample_register.type,    
                     sample_allocation.gamma,    
                     gamma_results.act,    
                     gamma_results.act_sd,    
                     gamma_results.mdl,    
                     gamma_results.bdl,    
                     DATE_FORMAT(count_dt,'%d-%m-%Y') as count_dt    
               FROM sample_register    
               LEFT JOIN sample_allocation    
               ON sample_register.usin=sample_allocation.usin    
               LEFT JOIN gamma_results    
               ON gamma_results.usin = sample_register.usin    
               AND gamma_results.istp='Cs137'    
               WHERE mid(sample_register.usin,3,1)='F'    
               AND sample_register.doc BETWEEN '2015-01-01'    
                                       AND '2015-03-31'    
                                       AND sample_register.category='ter'    
                                       AND sample_allocation.gamma='Y'    
               ORDER BY mid(sample_register.usin,3,1),    
                        sample_register.doc,    
                        sample_register.usin) AS a    
               LEFT JOIN (SELECT sample_register.usin,    
                                 gamma_results.act,    
                                 gamma_results.act_sd,    
                                 gamma_results.mdl,    
                                 gamma_results.bdl    
                          FROM sample_register    
                          LEFT JOIN gamma_results    
                          ON gamma_results.usin = sample_register.usin    
                          AND gamma_results.istp='k40'    
                          WHERE mid(sample_register.usin,3,1)='F'    
                          AND sample_register.doc    
                          BETWEEN '2015-01-01'    
                          AND '2015-03-31'    
                          AND (sample_register.category='ter')    
                          ORDER BY mid(sample_register.usin,3,1),    
                                   sample_register.doc,    
                                   sample_register.usin) AS b    
               ON a.usin=b.usin
Run Code Online (Sandbox Code Playgroud)

gamma_results表中有4条记录.2015年4月10日和2015年4月18日各有两条记录.

USIN        istp     act     count_dt
-----------------------------------------
15FML002    Cs137   0.00769  10/04/15
15FML002    K40     0        10/04/15
15FML002    Cs137   0.00608  18/04/15
15FML002    K40     12.117   18/04/15
Run Code Online (Sandbox Code Playgroud)

以下列形式查询输出数据(为方便起见,我删除了一些字段)

15FML002            0.00769 Y   10/04/15    00
15FML002            0.00769 Y   10/04/15    12.117
15FML002            0.00608 Y   18/04/15    00
15FML002            0.00608 Y   18/04/15    12.117
Run Code Online (Sandbox Code Playgroud)

但我希望得到两个记录的输出.就是这样

15FML002            0.00769 Y   10/04/15    00
15FML002            0.00608 Y   18/04/15    12.117
Run Code Online (Sandbox Code Playgroud)

如何重新构建(加入或联合)查询以获得这样的输出?///于2015年4月30日编辑

由于他们的网站存在一些问题,我无法创建一个sqlfiddle.以下是两个表sample_register和gamma结果的DDL和DML.此时,可以忽略sample_allocation表.

CREATE TABLE `sample_register` (
  `usin` varchar(11) NOT NULL,
  `sample_id` varchar(7) NOT NULL,
  `doc` date NOT NULL,
  `location` varchar(255) DEFAULT NULL,
  `category` varchar(50) DEFAULT NULL,
  `type` varchar(255) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  `fwt` decimal(10,2) DEFAULT NULL COMMENT 'This filed contains either fwt in gms or volume in ltr for milk or volume of air for particulate',
  `dwt` decimal(10,2) DEFAULT NULL,
  `ashwt` decimal(10,2) DEFAULT NULL,
  `user` varchar(255) DEFAULT NULL,
  `to_dt` date DEFAULT NULL COMMENT 'This is for particulate sample filter removal date',
  `wc` decimal(10,2) DEFAULT NULL,
  `oc` decimal(10,2) DEFAULT NULL,
  `ac` decimal(10,2) DEFAULT NULL,
  `status` varchar(1) DEFAULT NULL,
  `remarks` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`usin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `sample_register` VALUES ('15FML002', 'NIL', '2015-04-09', 'MALLAPUR', 'ter', 'MILK', 'milk', '2000.00', null, null, '1604015', null, null, null, null, null, null);
DROP TABLE IF EXISTS `gamma_results`;
CREATE TABLE `gamma_results` (
  `usin` varchar(255) NOT NULL,
  `sysid` varchar(255) NOT NULL,
  `count_time` decimal(10,0) DEFAULT NULL,
  `geo` varchar(255) DEFAULT NULL,
  `vol` decimal(10,2) DEFAULT NULL,
  `energy` decimal(10,2) DEFAULT NULL,
  `istp` varchar(255) DEFAULT NULL,
  `bkg` decimal(10,5) DEFAULT NULL,
  `eff` decimal(10,3) DEFAULT NULL,
  `sigma` decimal(10,5) DEFAULT NULL,
  `ncps` decimal(10,5) DEFAULT NULL,
  `sd` decimal(10,5) DEFAULT NULL,
  `mdl` decimal(10,5) DEFAULT NULL,
  `act` decimal(10,5) DEFAULT NULL,
  `act_sd` decimal(10,5) DEFAULT NULL,
  `bdl` varchar(1) DEFAULT NULL,
  `entry_time` datetime DEFAULT NULL,
  `entered_by` int(11) DEFAULT NULL,
  `count_dt` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `gamma_results` VALUES ('15FML002', 'HPGE2', '25000', 'nb', '1000.00', '364.48', 'I131', '0.01000', '3.400', '0.00190', '-0.01000', '0.00041', '0.06882', null, '0.00000', 'Y', '2015-04-13 10:24:11', '1619381', '2015-04-10');
INSERT INTO `gamma_results` VALUES ('15FML002', 'HPGE2', '25000', 'nb', '1000.00', '661.66', 'Cs137', '0.00020', '2.060', '0.00027', '-0.00020', '0.00006', '0.00769', null, '0.00000', 'Y', '2015-04-13 10:24:57', '1619381', '2015-04-10');
INSERT INTO `gamma_results` VALUES ('15FML002', 'HPGE2', '25000', 'nb', '1000.00', '1460.73', 'K40', '0.00500', '0.911', '0.00134', '-0.00450', '0.00032', '1.37855', null, '0.00000', 'Y', '2015-04-13 10:25:37', '1619381', '2015-04-10');
INSERT INTO `gamma_results` VALUES ('15FML002', 'HPGE2', '15000', 'nb50', '2000.00', '661.66', 'Cs137', '0.00020', '3.380', '0.00035', '-0.00020', '0.00006', '0.00608', null, '0.00000', 'Y', '2015-04-20 10:21:48', '1619381', '2015-04-18');
INSERT INTO `gamma_results` VALUES ('15FML002', 'HPGE2', '15000', 'nb50', '2000.00', '1460.73', 'K40', '0.00500', '1.550', '0.00173', '0.04008', '0.00176', '0.52302', '12.11700', '0.53200', 'N', '2015-04-20 10:23:00', '1619381', '2015-04-18');
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 8

之前我见过这样的输出.

它是由连接中的微小错误引起的.如果我没记错的话,我通过将一些连接嵌套为子查询来解决这个问题,所以我将每个表添加到一个连接的现有表中.我可能过度混合但它确实很好用.(更新:是的,我现在看到的正是你在做什么).

在该混合中的某个时刻,连接并不是唯一的,或者您安排它的方式并不是唯一的,因此SQL为您提供了它可以提供的所有组合.

(当然,假设这不仅仅是一个GROUP BY令人不安的东西.这就是这样的问题的另一个来源.)

我会仔细研究你的SQL,看看我是否能发现问题,但是一点点试验和错误会更快,更快.

更新1:这是一个非常令人印象深刻的黑客或错误,我无法理解.

LEFT JOIN gamma_results    
ON gamma_results.usin = sample_register.usin    
AND gamma_results.istp='Cs137' 
Run Code Online (Sandbox Code Playgroud)

我从来没有见过条件作为加入的一部分.我不能告诉你这是否会起作用,但我的直觉反应是想把它放在WHERE条款中.随便看看你在做什么,并且我没有动手实际项目(也不知道所有事情),随意带我上学.

更新2:鉴于您的硬编码连接必须接近工作,我的感觉是,当您使用聚合函数(count)时,我希望在嵌套SELECT中使用GROUP .

我记得曾经做过一个非常复杂的查询,当你接下来它实际上是在说"为每个table_a添加table_b".诚实地交朋友,GROUP BY如果这不能解决你的问题,那么我就是一只小无害的猴子.

  • Re:条件作为`JOIN`的一部分...在`LEFT`,`RIGHT`或(对于其他SQL实现)`OUTER`中,在连接中放置条件可能非常有用.它的含义与条件之外的含义截然不同.事实上,它会使其中一个`JOIN'成为一个有效的"INNER JOIN",因为它需要该列中的值才能使条件有机会被满足.如果您曾经看过"OUTER JOIN",您将立即了解其中的好处. (4认同)

Ale*_*lex 4

首先,如果您需要查询某些特定数据集的帮助,您应该提供相同的数据和 sqlfiddle。

由于我没有小提琴的数据,所以我的猜测是:

SELECT sample_register.usin,    
     DATE_FORMAT(sample_register.doc,'%d-%m-%Y') as doc1,    
     sample_register.location,    
     sample_register.description,    
     sample_register.type,    
     sample_allocation.gamma,    
     gr.act,    
     gr.act_sd,    
     gr.mdl,    
     gr.bdl,    
     gr.count_dt,
     grK40.act  
FROM sample_register    
INNER JOIN sample_allocation    
ON sample_register.usin=sample_allocation.usin
   AND sample_allocation.gamma='Y'
LEFT JOIN (
   SELECT
       usin,
    act,    
    act_sd,    
    mdl,    
    bdl,
    count_dt,
    DATE_FORMAT(count_dt,'%d-%m-%Y') as count_dt_formatted    
   FROM gamma_results    
   WHERE istp='Cs137'
) gr
ON gr.usin = sample_register.usin
LEFT JOIN gamma_results grK40   
 ON grK40.usin = gr.usin
    AND grK40.istp='k40'
    AND grK40.count_dt = gr.count_dt
WHERE mid(sample_register.usin,3,1)='F'    
AND sample_register.doc BETWEEN '2015-01-01' AND '2015-03-31'    
   AND sample_register.category='ter'    
ORDER BY mid(sample_register.usin,3,1),    
    sample_register.doc,    
    sample_register.usin
Run Code Online (Sandbox Code Playgroud)

但这只是一个猜测,因为它对我来说看起来很奇怪。

你写了:

gamma_results 表中有 4 条记录。10/04/2015 和 18/04/2015 各有两条记录。: USIN, istp, actcount_dt但在您的查询中使用act,act_sd,mdl,bdl,DATE_FORMAT(count_dt,'%d-%m-%Y') as count_dt,因此我们可以假设您还有其他一些列,例如: act_sd,mdl,bdl

下面你写的是:按以下形式查询输出数据(为了方便我删除了一些字段)

15FML002            0.00769 Y   10/04/15    00
15FML002            0.00769 Y   10/04/15    12.117
Run Code Online (Sandbox Code Playgroud)

即使删除了某些字段,这里还有哪些字段?

逻辑上它是:usin,act, UNKNOWN , count_dt, UNKNOWN(等于actwhen istp='K40')。但这是不可能的,因为你的查询请求中没有这样的字段。在我看来,提供的输出是其他一些查询的结果,而不是您向我们展示的结果。

但到目前为止,这是我的猜测。如有任何疑问,欢迎您。