MYSQL SELECT,但有条件

MYSQL SELECT but with conditions

提问人:RMC 提问时间:10/5/2023 最后编辑:RMC 更新时间:10/11/2023 访问量:66

问:

是否可以在MYSQL SELECT语句中包含取决于用户选择的条件?为清楚起见,进行了编辑。 可以这样做的东西:

IF user *does A* SELECT * FROM myTable
IF user *does B* SELECT colB, colC, colD FROM myTable
ELSE SELECT * FROM myTable WHERE ID < 5

Original Post引用了专有前端,但我只想看看仅在MYSQL查询中是否有解决方案。

我有一个MYSQL查询,它根据列值的下拉选择返回表的过滤视图。我想包含一个选项,如果下拉列表与列中的值匹配,或者用户选择“全部显示”,则返回所有表。像这样的东西:

有没有办法像这样使用 ELSE:

SELECT colA FROM mytable
WHERE *userChoice* = colA
ELSE SELECT * FROM myTable

或者,我认为可以用 case 语句来完成,但我无法弄清楚语法:

    CASE
        WHEN userPick = colA THEN SELECT colA FROM myTable
        WHEN userPick = colB THEN SELECT colB FROM myTable
        WHEN userPick = selectAll THEN SELECT * FROM myTable
        ELSE SELECT * FROM myTable
    END 

我想在查询中添加一个子句,如果用户没有从 colA 中选择不同的值,该子句将允许我返回其他内容。Rough image of what I currently have.

MySQL 选择 案例

评论

3赞 P.Salmon 10/5/2023
MySQL没有下拉列表,所以你是否也使用一些东西,例如PHP?
0赞 RMC 10/5/2023
是的,我正在使用接受 mysql 查询的前端
2赞 Rodney Salcedo 10/7/2023
您应该指定在前端使用什么框架或任何内容
1赞 Community 10/7/2023
请编辑问题,将其限制在特定问题上,并具有足够的细节以确定适当的答案。
0赞 gaborsch 10/9/2023
什么是固定的,什么是变化的案例?列数正在变化(我猜是从示例中),但是表格是一样的吗?where 条件是否相同?其他人都喜欢订购一样吗?

答:

2赞 Jualrumahmu.com 10/5/2023 #1

需要构建查询字符串,检查此线程 Mysql 基于逻辑在存储过程中动态构建查询字符串

使用下面的查询,如下所示

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(input VARCHAR(15))
BEGIN
SET @input = input;

if @input="asc" then
    SET @sort = " order by ActivityLogKey asc";
elseif @input = "desc" then
    SET @sort = " order by ActivityLogKey desc";
else
    SET @sort ="";
end if;

SET @query = CONCAT('select * from activitylog ',@sort,' limit 0, 5');

PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END
0赞 RMC 10/10/2023 #2
SELECT *
FROM myTable
WHERE (colA) LIKE '%SearchString%'
OR (SelectAll) LIKE '%SA%'

我找到了一个解决方法,我添加了一个 SelectAll 列并在我的 SELECT 查询中引用了它

0赞 gaborsch 10/10/2023 #3

如果是已编译的语句,则无法更改列数。语句应返回相同数量的列。select

您可以做的是返回所有可能的列,并使用联合构造来启用具有特定 where 条件的选择。这样,您可以使用不同的表、不同的 where 条件 - 甚至不同的列(如果您的处理逻辑可以处理的话)。关键是联合中的所有选择都必须返回相同数量的列,因此您需要作为占位符返回。第一个选择必须定义所有列别名,尤其是当值为 null 时。null

SELECT t1.colA, null as colB, null as colC
  FROM myTable t1
 where userPick = colA
UNION ALL
SELECT null, t2.colB, null
  FROM myTable t2
 where userPick = colB
   and t2.id < 5
UNION ALL
SELECT t3.colA, t3.colB, t3.colC
  FROM myTable t3
 where userPick <> colA AND userPick <> colB  -- this is the ELSE part

请注意,您不需要分支,因为它与部件相同。userPick = selectAllELSE

评论

0赞 RMC 10/16/2023
嗨,谢谢,我不想更改列数,很抱歉,我没有在我的粗略草图中显示过滤表的整个版本。我想要在选择查询中有一个过滤的返回选项,如果需要,可以选择清除过滤器/全选