【问题标题】:Select from Multiple table, but ignore if not found从多个表中选择,但如果找不到则忽略
【发布时间】:2018-11-27 16:41:03
【问题描述】:

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

所以,我希望修改这个查询,如果找不到值,where 将忽略一个表,但返回找到该值的其余表。

这是 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 表的值时,其余数据将不会返回。我只是希望它忽略这一点,显示发现的内容。喜欢联盟。

【问题讨论】:

标签: php mysql database mysqli


【解决方案1】:

正如一些 cmets 指出的那样,您使用的是过时的语法,即 INNER JOIN 会导致您获得结果的表。您需要 LEFT JOIN 表。因此,即使 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]'

【讨论】:

  • 您好,感谢您的解决方案,我更新了问题。请检查一下。我正在使用 OR 语句进行多重匹配。
  • 再次:这是过时的语法;你不应该使用它。
  • 请检查一下,我用你的语法更新了。仍然像以前一样返回(所有 3 个表中都存在行)
  • 在我的回复中我提到使用 INNER JOIN 会产生你现在得到的结果。这就是它的作用!你刚刚确认了!您需要使用 LEFT JOIN 复制代码;那么它将起作用!请阅读此内容以了解 LEFT JOIN 和 INNER JOIN 之间的区别:stackoverflow.com/questions/5706437/…
猜你喜欢
  • 2016-12-17
  • 2013-08-21
  • 2015-07-12
  • 2017-02-11
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多