Результаты подзапроса mysql concat как самого подзапроса - PullRequest
1 голос
/ 18 августа 2011

это немного сложно, я думаю.

то, что я пытаюсь достичь, это сгенерировать строку через group_concat, а затем запустить ее как запрос.мой запрос возвращает numCustomers как запрос, который я хотел бы выполнить.

возможно ли выполнить его как запрос внутри основного запроса?

Мой запрос выглядит следующим образом:

SELECT 
lastSent,tblmailinglistgroups.addDate,title, tblmailinglistgroups.active, tblmailinglistgroups.id,groupType,
CASE 
WHEN (groupType='s') THEN (SELECT COUNT(id) FROM tblmailinglistgroupscusts WHERE groupID=tblmailinglistgroups.id) 
WHEN (groupType='d') THEN (
CONCAT('SELECT COUNT(tblcustomers.id) FROM tblcustomers INNER JOIN tblcustomersextension ON tblcustomers.id=tblcustomersextension.customerID WHERE 1=1 ',
(SELECT GROUP_CONCAT(filterAndOr,' ',openBrackets,' ',filterBy, ' ',(
SELECT 
CASE 
WHEN filterOperator='ne' THEN '!=' WHEN filterOperator='e' THEN '=' WHEN filterOperator='be' THEN '>=' WHEN filterOperator='se' THEN '<=' WHEN filterOperator='b' THEN '>' WHEN filterOperator='s' THEN '<' WHEN filterOperator='in' THEN 'in' WHEN filterOperator='ni' THEN 'not in' WHEN 'nu' THEN 'IS NULL' 
END AS operator),' \'',filterValue,'\' ',closeBrackets SEPARATOR ' ') AS x 
FROM `tblmailinglistgroupsrules1`
WHERE groupID=tblmailinglistgroups.id
)
)
) END AS numCustomers
FROM 
tblmailinglistgroups 
LEFT JOIN tblmailinglistgroupscusts ON (tblmailinglistgroupscusts.groupID = tblmailinglistgroups.id) 
GROUP BY tblmailinglistgroups.id 
ORDER BY tblmailinglistgroups.id DESC

Структура таблицы:

CREATE TABLE IF NOT EXISTS `tblmailinglistgroups` (
`id` bigint(12) NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL DEFAULT '',
`addDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` enum('on','off') NOT NULL DEFAULT 'on',
`lastSent` date NOT NULL DEFAULT '0000-00-00',
`groupType` enum('s','d') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=67 ;


CREATE TABLE IF NOT EXISTS `tblmailinglistgroupscusts` (
`id` bigint(12) NOT NULL AUTO_INCREMENT,
`groupID` bigint(12) NOT NULL DEFAULT '0',
`custID` int(5) NOT NULL,
`email` varchar(200) NOT NULL DEFAULT '',
`phone` varchar(20) NOT NULL,
`comments` varchar(250) NOT NULL,
`addDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `groupID` (`groupID`),
KEY `custID` (`custID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7813 ;


CREATE TABLE IF NOT EXISTS `tblmailinglistgroupsrules1` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`groupID` int(5) NOT NULL,
`filterAndOr` enum('AND','OR') NOT NULL,
`openBrackets` enum('','(','((','(((','((((') NOT NULL,
`filterBy` varchar(40) NOT NULL,
`filterOperator` varchar(40) NOT NULL,
`filterValue` varchar(40) NOT NULL,
`closeBrackets` enum('',')','))',')))','))))') NOT NULL,
`showOrder` int(5) NOT NULL,
`addDate` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=415 ;

1 Ответ

0 голосов
/ 19 августа 2011

Вы можете использовать хранимые процедуры для выполнения запроса от concat. Нет способа сделать это внутри простого SQL-запроса.

Хорошее объяснение можно найти здесь: http://www.it -iss.com / mysql / mysql-хранимые процедуры-и-динамические-sql /

ОПАСНОСТЬ : если это веб-приложение, злоумышленники могут манипулировать результатом оператора concat для выполнения собственных, неправильных операторов, таких как DROP DATABASE.

...