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_id
和cats_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 表中的多个列并创建不存在的列