从多个表中选择,但如果找不到,则忽略

时间:2018-11-27 16:41:03

标签: php mysql database mysqli

使用此查询,我从多个表中选择行。不幸的是,如果一个表中没有一行,那么所有表中的行都不会返回。这是因为我正在使用AND运算符。

因此,我希望修改该查询,如果找不到值,将忽略该表,但返回找到该值的表的其余部分。

这是MySQL查询:

   foreach ($courseArr as $term) {
$term = trim($term);
if (!empty($term)) {

        $courseSectionSql[] = "courseDataApp.course = '$term' AND courseDataApp.section = '$sectionArr[$i]'";

    $i++;

}

}

$data = $db->rawQuery("SELECT courseDataApp.*, facultyDatabase.*, books.* 
                        FROM courseDataApp
                        INNER JOIN facultyDatabase ON facultyDatabase.initial = courseDataApp.faculty
                        INNER JOIN books           ON books.course = courseDataApp.course  WHERE ".implode(' OR ', $courseSectionSql));

这就是回报:

 {
"id":11,
// courseDataApp values 
"faculty":"AKH1", 
"course":"CSE241",
"section":"7",
.
.
.
.
.
.
.

// facultyDatabasevalues     
"initial":"AKH1",    
"name":"Ms. Kamal Habi",
"dept":"ECE",
.
.
.
.
.
.




// books values

"books": "Digital Logic Design"
},

所以问题是,当找不到facultyDatabase或books表中的值时,其余数据将不会返回。我只希望它忽略它,显示发现的内容。像联盟。

1 个答案:

答案 0 :(得分:1)

正如一些评论所指出的那样,您使用的是INNER JOINs表中导致您得到结果的过时语法。您需要左联接表。因此,即使LEFT JOINed表中没有条目,您也将得到结果。这样的事情应该起作用

SELECT courseDataApp.*, facultyDatabase.*, books.*
FROM courseDataApp
LEFT JOIN facultyDatabase ON facultyDatabase.initial = courseDataApp.faculty
LEFT JOIN books           ON books.course = courseDataApp.course
    WHERE courseDataApp.course = '$term' 
      AND courseDataApp.section = '$sectionArr[$i]'

这样写,您将具有与当前语法中的查询等效的功能,如果INNER JOINed表中没有任何条目,则不会返回任何内容。

SELECT courseDataApp.*, facultyDatabase.*, books.* 
FROM courseDataApp
INNER JOIN facultyDatabase ON facultyDatabase.initial = courseDataApp.faculty
INNER JOIN books           ON books.course = courseDataApp.course
    WHERE courseDataApp.course = '$term' 
      AND courseDataApp.section = '$sectionArr[$i]'