繁体   English   中英

一个查询从mysql中的2个表中获取数据(使用php)

[英]One query to get data out of 2 tables in mysql (with php)

好的,我有一个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中对应。

我在想左加入。 但这似乎只是像将我所有的table2字段名称一样添加到table1中。这很复杂。我希望大家都明白。

如果它不可能在1个查询中...我想我可以选择一种获取数据的方法,但这会让我的生活变得更加轻松...


目标:用户具有导出数据表格。 他可以通过此表格从表1和表2中为每个条目选择所需的字段(带有复选框)。 然后他们可以为任何给定字段提供过滤器。 例如id=1name 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 []中

不能100%确定我了解table2table3之间的关系,但是我认为您正在寻找这样的东西:

编辑 :基于评论的反馈修改查询。 假设将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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM