2015-10-30 33 views
0

我想这个MySQL查询该列 -组合两个列作为新使用相同的MySQL查询

SELECT pan_1, dp_id, client_id, CONCAT(dp_id,client_id) AS ref, name_s, bonds 
FROM `holding_details` 
WHERE `date` = '2015-10-23' 
AND comp_code = '33' 
AND ref NOT IN 
(SELECT CONCAT(dp_id,client_id) AS ref FROM `promoters` WHERE comp_code = '33') 
GROUP BY pan_1 
ORDER BY bonds DESC 

通过阅读上面的查询,你只需明白什么结果我想要的。我有两个分开的列dp_id和client_id都在同一个表中。我想从'hold_details'表中得到一些结果,除了在dp_id和client_id列的条件下出现在'发起人'表中的结果之外,我将它们合并,因为它使它们成为唯一记录。我试过上面的MySql查询,但它显示“未知列参考”错误。请告诉我,不可能在同一个查询中使用组合列,我该如何实现该结果。由于

+0

我的理解是。你想从两个不同的表中选择数据? 试过左连接了吗? –

+0

不想加入表格。我只想要hold_details表中的数据,但只有那些不存在于启动器表中的dp_id和client_id。 –

回答

1

不完全回答你的问题,但也许您的问题....
更好地利用NOT EXIST。它有使用索引比你CONCAT()的方式更好的机会 - 方法....

SELECT 
    pan_1, dp_id, client_id, name_s, bonds 
FROM 
    `holding_details` as hd 
WHERE 
    hd.`date` = '2015-10-23' 
AND 
    hd.comp_code = '33' 
AND 
    NOT EXISTS (
     SELECT 
      * 
     FROM 
      promoters as p 
     WHERE 
      p.comp_code = '33' 
      AND hd.dp_id=p.dp_id 
      AND hd.client_id=p.client_id 
    ) 
GROUP BY 
    pan_1 
ORDER BY 
    bonds DESC 
+0

谢谢@VolkerK,做了一些小的改动后,对我有用.. –

1

您可以使用NOT EXISTS

SELECT pan_1, dp_id, client_id, CONCAT(dp_id,client_id) AS ref, name_s, bonds 
FROM `holding_details` d 
WHERE `date` = '2015-10-23' 
AND comp_code = '33' 
AND NOT EXISTS 
    (SELECT 'x' FROM `promoters` p 
    WHERE p.comp_code = '33' 
     AND p.dp_id = d.dp_id 
     AND p.client_id = d.client_id) 
GROUP BY pan_1 
ORDER BY bonds DESC 

这应该工作了:仅指定两列,并从选择返回两列(不CONCAT!):

SELECT pan_1, dp_id, client_id, CONCAT(dp_id,client_id) AS ref, name_s, bonds 
FROM `holding_details` 
WHERE `date` = '2015-10-23' 
AND comp_code = '33' 
AND (dp_id, client_id) NOT IN 
    (SELECT dp_id, client_id) AS ref FROM `promoters` WHERE comp_code = '33') 
GROUP BY pan_1 
ORDER BY bonds DESC 

你自己如果你不使用别名ref,而是使用表达式本身,那么尝试也可能会奏效。不过,我更喜欢上面的那个。因为使用索引,Concatting使其不那么清晰和效率低下。上面的查询可以非常有效,如果你有正确的索引。无论如何,那就是:

SELECT pan_1, dp_id, client_id, CONCAT(dp_id,client_id) AS ref, name_s, bonds 
FROM `holding_details` 
WHERE `date` = '2015-10-23' 
AND comp_code = '33' 
AND CONCAT(dp_id,client_id) NOT IN 
(SELECT CONCAT(dp_id,client_id) AS ref FROM `promoters` WHERE comp_code = '33') 
GROUP BY pan_1 
ORDER BY bonds DESC 
0

尝试此查询,

SELECT pan_1, hd.`dp_id`, hd.`client_id`, CONCAT(hd.`dp_id`,hd.`client_id`) AS ref, name_s, bonds 
FROM `holding_details` as hd 
LEFT JOIN `promoters` as p on p.`dp_id` = hd.`dp_id` AND p.`client_id` = hd.`client_id` 
WHERE hd.`date` = '2015-10-23' 
AND hd.`comp_code` = '33' 
AND p.`dp_id` <> hd.`dp_id` 
AND p.`client_id` <> hd.`client_id` 
GROUP BY pan_1 
ORDER BY bonds DESC 
+0

这需要一个WHERE子句用于isnull(p.dp_id)或类似的东西,否则结果会比预期的包含更多的记录....这是一个可行的解决方案;查询优化器非常善于“理解”这样的查询) – VolkerK