好的,我有一个table1女巫包含我的主要个人资料数据。
然后我有table2女巫包含我的自定义用户创建字段的名称(和类型)(我的管理员可以根据需要为主要配置文件创建自定义字段)
我有table3,它包含table2中自定义字段的值。因此,表3引用了table2作为字段名称,并链接到table1条目。
CREATE TABLE IF NOT EXISTS `table1` (
`id` int(11) NOT NULL auto_increment,
`numero_membre` varchar(255) NOT NULL default '',
`membre` tinyint(1) NOT NULL default '0',
(...ALOT OF FIELDS, I DONT FEEL THE NEED TO SHOW THEM ALL)
`ordering` int(10) NOT NULL default '0',
`dateModified` datetime NOT NULL default '0000-00-00 00:00:00',
`dateCreated` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `table2` (
`id` int(10) NOT NULL auto_increment,
`nom` varchar(255) NOT NULL default '',
`type` varchar(255) NOT NULL default '',
`published` tinyint(1) NOT NULL,
`ordering` int(10) NOT NULL,
`datemodified` datetime NOT NULL default '0000-00-00 00:00:00',
`datecreated` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
);
CREATE TABLE `table3` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`idchamps` VARCHAR(255) NOT NULL DEFAULT '',
`idprofil` VARCHAR(255) NOT NULL DEFAULT '',
`value` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY( `id` )
);
所以我想选择table1中的所有行,我希望它从table2加入名称,并使其值=来自对应的table3。
我在想LEFT JOIN。但这似乎只是像我的table2字段名一样添加到table1 ......这很复杂......我希望你们都明白。
如果在一个查询中不可能......我想我有另外一种方法来获取数据,但这会让我的生活变得更容易......
目标:用户有一个导出数据表单。这个表单他可以从table1和table2中为每个条目选择他想要的字段(带复选框)。然后他们可以为任何给定的字段提供过滤器。例如id=1
或name LIKE %Somthing%
来过滤结果。
复选框值保存在addfield []中 $ this-> getFields()返回所有字段,以便循环抛出过滤后的值。
这是我的代码,它生成SQL(类的一部分):
function getExportObject() {
// --> FOR EXPORT
//Building Query
$postdata = JRequest::get( 'post' );
$exportFields = $postdata['addfield']; //Table 1
$exportCustomFields = $postdata['addcfield']; //table 2 name, table 3 value
$sqlSelect = '';
//Main profil Fields...
foreach($exportFields as $key => $field) {
if ($sqlSelect!='') $sqlSelect .= ', ';
$sqlSelect .= '`'.$field.'`';
}
//Add filters to the SELECT
//GET LIST OF ALL FIELDS....
$sqlFilter = '';
$loopFields = $this->getFields();
foreach($loopFields as $key => $field) {
if (JRequest::getVar('filter_'.$field)!='') {
if ($sqlFilter=='') { $sqlFilter .= " WHERE "; }
else { $sqlFilter .= " AND "; }
switch(JRequest::getVar('filter_'.$field)) {
case 'EQUAL' : $sqlFilter .= "`".$field."`='".JRequest::getVar('filter_val_'.$field)."'"; break;
case 'NOT_EQUAL' : $sqlFilter .= "`".$field."`!='".JRequest::getVar('filter_val_'.$field)."'"; break;
case 'CONTAINS' : $sqlFilter .= "`".$field."` LIKE '%".JRequest::getVar('filter_val_'.$field)."%'"; break;
case 'NOT_CONTAINS' : $sqlFilter .= "`".$field."` NOT LIKE '%".JRequest::getVar('filter_val_'.$field)."%'"; break;
default : die('Utilisation invalid. SVP. essayez de nouveau.'); break;
}
}
}
//PUTTING IT ALL TOGETTHER
//"SELECT t1.*, t2.nom, t3.value FROM table1 t1 LEFT JOIN table3 t3 INNER JOIN table2 t2 ON t3.fieldname = t2.nom ON t1.id = t3.idprofil"
$query = "SELECT ".$sqlSelect." FROM `table1`".$sqlFilter;
echo $query;
exit();
$this->_db->setQuery($query);
$exportList = $this->_db->loadObjectList();
return $exportList;
} //End of getExportObject()
因此该函数用于获取table1的值。我已经为table2设置了任何代码。但是我们可以说表2变量与表1相同,但在后变量addcfield []
答案 0 :(得分:1)
不是100%确定我理解table2
和table3
之间的关系,但我认为您正在寻找类似的内容:
编辑:根据评论中的反馈修改了查询。假设table2 id被添加到table3。
SELECT t1.*, t2.nom, t3.value
FROM table1 t1
LEFT JOIN table3 t3
INNER JOIN table2 t2
ON t3.table_2_id = t2.id
ON t1.id = t3.idprofil