2012-11-29 14 views
7

पर अभिव्यक्तियों के साथ कई में शामिल होने का निष्पादन वास्तव में मैं एक प्रोजेक्ट पर काम कर रहा हूं और मैं देख रहा हूं कि ज़ेंड फ्रेमवर्क 2 जटिल प्रश्नों को कैसे प्रबंधित करता है (विशेष रूप से एन: एम टेबल में कैसे शामिल होना है और GROUP_CONCAT और अन्य का उपयोग कैसे करें फ़ंक्शन)।ज़ेंड फ्रेमवर्क 2

SELECT o. * , x.group_one, x.group_two 
FROM table_one AS o 
LEFT JOIN (
SELECT r.fk1, GROUP_CONCAT(t.field_one) AS group_one, GROUP_CONCAT(t.field_two) AS group_two 
FROM table_three AS r 
INNER JOIN table_two AS t ON r.fk2 = t.id 
GROUP BY r.fk1 
) AS x ON o.id = x.fk1 
LIMIT 0 , 20; 

इस डाटाबेस स्कीमा का उपयोग कर: आप इस क्वेरी निष्पादित करने के लिए सबसे अच्छा अभ्यास जानते हैं

-- 
-- Database: `table-test-1` 
-- 

-- -------------------------------------------------------- 

-- 
-- Structure of table `table_one` 
-- 

CREATE TABLE `table_one` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
`field_1` varchar(255) NOT NULL, 
`field_2` varchar(255) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; 

-- 
-- Dump for table `table_one` 
-- 

INSERT INTO `table_one` (`id`, `field_1`, `field_2`) VALUES 
(1, 'baz', 'bat'), 
(2, 'foo', 'bar'), 
(3, 'foo2', 'bat2'), 
(4, 'fuz', 'bar2'), 
(5, 'poo', 'pee'); 

-- -------------------------------------------------------- 

-- 
-- Structure of table `table_three` 
-- 

CREATE TABLE `table_three` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
`fk1` bigint(20) NOT NULL, 
`fk2` bigint(20) NOT NULL, 
PRIMARY KEY (`id`), 
KEY `fk1` (`fk1`,`fk2`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ; 

-- 
-- Dump for table `table_three` 
-- 

INSERT INTO `table_three` (`id`, `fk1`, `fk2`) VALUES 
(5, 1, 1), 
(1, 1, 2), 
(6, 1, 4), 
(2, 2, 2), 
(4, 3, 2), 
(7, 3, 3), 
(3, 4, 1), 
(8, 5, 3), 
(9, 5, 4); 

-- -------------------------------------------------------- 

-- 
-- Structure of table `table_two` 
-- 

CREATE TABLE `table_two` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
`field_one` varchar(255) NOT NULL, 
`field_two` varchar(255) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; 

-- 
-- Dump for table `table_two` 
-- 

INSERT INTO `table_two` (`id`, `field_one`, `field_two`) VALUES 
(1, 'label_name_1', 'label_extended_name_1'), 
(2, 'label_name_2', 'label_extended_name2'), 
(3, 'label_name_3', 'label_extended_name_3'), 
(4, 'label_name_4', 'label_extended_name4'); 

पल मैं एक हाथ से बने क्वेरी के साथ एक Zend \ Db \ Sql \ Sql कथन का उपयोग हल में लेकिन मैं जानना चाहता हूं कि वास्तव में, मूल चयन() (संभवतः सिद्धांत या इसी तरह के प्रयोग किए बिना) के साथ ऐसा करने का कोई तरीका है या नहीं।

अग्रिम में :)

उत्तर

4

धन्यवाद आप use Zend\Db\Sql\Predicate\Expression; आयात करने के लिए group_concat उपयोग करना होगा।

पूर्व:

$sql = new Sql($this->adapter); 
$select = $sql->select(); 
$select->columns(array('*')); 
$select->from('tblCGii'); 
$select->join("tblCGFieldValues", "tblCGii.id = tblCGFieldValues.Cgii_id", array("field_values"=>new Expression("Group_Concat(tblCGFieldValues.field_values)")),"LEFT"); 
$select->group('tblCGii.id');