mysql在on语句中检查多个列

Posted

技术标签:

【中文标题】mysql在on语句中检查多个列【英文标题】:mysql check multiple column in on statement 【发布时间】:2021-12-30 09:31:45 【问题描述】:

我被困在 1 个left join 查询中,我想在其中检查 on 语句中的多个列。

默认情况下,在数据库中,某些列是 null,我想在 on 语句中检查它。

现在的问题是,当我使用 OR 运算符运行查询时,它只运行第一个条件,其余的被跳过。

如果我使用 AND 运算符,它会引发错误。

那么有没有办法从多个条件中获取数据?

这是我的查询:

$data = "SELECT 
  b.book_name, b.book_id, 
  b.cats_id, b.cats_id1, 
  b.cats_id2, b.cats_id3, 
  b.cats_id4, b.cats_id5, 
  b.cats_id6, 
  b.book_rating, 
  b.book_author, 
  b.book_stock, 
  b.book_publisher, 
  b.book_front_img, 
  b.book_status, 
  p.publisher_id, 
  p.publisher_name, 
  a.author_id, 
  a.author_name, 
  cat.cats_id, 
  cat.cats_name, 
  cat.cats_status 
FROM 
 `books` AS b 
  LEFT JOIN `publisher` AS p 
    ON b.book_publisher = p.publisher_id 
  LEFT JOIN `author` AS a 
    ON b.book_author = a.author_id 
  LEFT JOIN categorys As cat 
    ON b.cats_id = cat.cats_id  
    OR b.cats_id1 = cat.cats_id  
    OR b.cats_id2 = cat.cats_id 
    OR b.cats_id3 = cat.cats_id 
    OR b.cats_id4 = cat.cats_id 
    OR b.cats_id5 = cat.cats_id 
    OR b.cats_id6 = cat.cats_id 
GROUP BY 
  b.book_name 
HAVING 
  cat.cats_name = '$search_data' 
  AND b.book_status = 1 
ORDER BY 
  $sorting 
LIMIT $offset, $page_limit" 

【问题讨论】:

格式正确的 SQL 更易于阅读和编写。 请提供示例数据以及您希望使用该数据实现的结果。此外,如果您提供一个最小的、可重现的示例,它会容易得多:我猜您的大部分 SQL 与您需要帮助的实际问题无关 看看LEFT JOIN categorys 子句,我建议您问题的根源实际上是非规范化的表结构。解决这个问题,它会使您的查询更简单。应该有一个单独的book_categories 表,而不是books 表中的多个“类别”列。了解数据库规范化,以及如何在数据库中正确实现多对多关系(例如图书和类别之间的关系)。 @ADyson 我已经制作了一个不同的类别表 是的,我知道您有一个类别表,但这不是我建议的。再次阅读我的评论,并在下面查看 O. Jones 答案的后半部分。你研究过数据库规范化吗?在您开始尝试设计数据库之前,这是一个必不可少的学习主题 【参考方案1】:

您的多作者图书也可能不会显示不止一位作者。你在滥用 mysql 的notorious nonstandard extension to GROUP BY。

要对此类查询进行故障排除,请使用 SET sql_mode = CONCAT_WS(',',@@sql_mode, 'ONLY_FULL_GROUP_BY') 禁用该扩展程序,然后再次尝试查询。您的 GROUP BY 子句中需要更多术语。

看起来每个books 行都有多个类别ID 列。看起来您想为每个人显示categorys 表中的信息。

使用GROUP BY b.book_id, p.publisher_id, a.author_id, cats.cats_id 防止 MySQL 对 GROUP BY 的奇怪处理隐藏您的数据。

我必须添加这个:您的多个 books.cats_id 列不是处理书籍和类别之间的多对多关系的 SQLish 方式。用我们行业的话说,您的books 表是非规范化

您需要的是一个名为books_categorys 的新表,其中包含book_idcats_id 两列。它被称为连接表。当该表中存在一行时,这意味着特定书籍属于特定类别。这是处理设置的 SQLish 方式,其中每本书可以属于零个或多个类别。这是一个解释。 MySQL join many to many single row

然后您从books 中删除所有cats_id 列,然后像这样检索类别。

然后您执行类似 SELECT 的操作来获取类别。

SELECT books.id, books.name,
       categorys.cats_id, categorys.cats_name, categorys.cats_status 
  FROM books
  JOIN books_categorys ON books.book_id = books_categorys.book_id
  JOIN categorys ON books_categorys.cats_id = categorys.cats_id
``

【讨论】:

以上是关于mysql在on语句中检查多个列的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO 检查 mySQL 表中的多个列并创建不存在的列

Ruby on Rails:未定义的方法,检查boolean if true语句

带有多个 PREPARE 语句的 Mysql 过程问题

如何检查在mysql中存储多个值的变量中是不是存在特定值?

在SQL中使用多个NOT IN语句

如何在显示列之前检查 SELECT 语句是不是存在