使用此查询,我从多个表中选择行。不幸的是,如果一个表中没有一行,那么所有表中的行都不会返回。这是因为我正在使用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表中的值时,其余数据将不会返回。我只希望它忽略它,显示发现的内容。像联盟。
答案 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]'