Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如果9/10列匹配,则返回该行。怎么做?_Mysql_Sql_Database_Postgresql_Sqlite - Fatal编程技术网

Mysql 如果9/10列匹配,则返回该行。怎么做?

Mysql 如果9/10列匹配,则返回该行。怎么做?,mysql,sql,database,postgresql,sqlite,Mysql,Sql,Database,Postgresql,Sqlite,我试图弄清楚如何进行查询,当大多数列与查询匹配时,该查询将返回行。 查询最好与PostgreSQL兼容。(如果它足够基本,那么我可以在SQLite中本地测试它,那将是非常棒的!但它不一定非得如此。) 我在这里发现了一个类似的线程,但该查询仅与Oracle的DB兼容 关于如何最有效地实现这一目标,有什么想法吗 示例表: col1|col2|col3 A | B | B Y | Y | Y X | B | X Y | B | B 查询将查找col1=A、co

我试图弄清楚如何进行查询,当大多数列与查询匹配时,该查询将返回行。 查询最好与PostgreSQL兼容。(如果它足够基本,那么我可以在SQLite中本地测试它,那将是非常棒的!但它不一定非得如此。)

我在这里发现了一个类似的线程,但该查询仅与Oracle的DB兼容

关于如何最有效地实现这一目标,有什么想法吗

示例表:

col1|col2|col3
  A |  B |  B 
  Y |  Y |  Y 
  X |  B |  X 
  Y |  B |  B 
查询将查找col1=A、col2=B和col3=B的列

我试图获得的输出:

col1|col2|col3
  A |  B |  B 
  Y |  B |  B 
为SQLite创建表架构

CREATE TABLE "t" (
    "col1"  TEXT,
    "col2"  TEXT,
    "col3"  TEXT
);
样本数据:

INSERT INTO 't' (col1, col2, col3)
VALUES ('A', 'B', 'B'),
('Y', 'B', 'B'),
('X', 'B', 'X'),
('A', 'B', 'X'),
('Y', 'Y', 'Y')

对于PostgreSQL,
WHERE
子句中的每个条件都可以计算为1表示
TRUE
,或0表示
FALSE
,因此您可以执行以下操作:

select * from tablename
where (col1 = 'A')::int + (col2 = 'B')::int + (col3 = 'B')::int +
      ............................................
      >= 9 
对于MySql或SQLite,它更简单:

select * from tablename
where (col1 = 'A') + (col2 = 'B') + (col3 = 'B') +
      ............................................
      >= 9

我就是这样做的。创建另一个具有“正确”值的表,并将其命名为
answer\u key
。然后将其交叉连接到当前表

SELECT c.*  
from candidates c cross join answer_key ak
order by (c.ans1=ak.ans1)::int+(c.ans2=ak.ans2)::int+(c.ans3=ak.ans3)::int desc;

这里有一个问题:

请在您的问题中添加示例数据。请阅读中的前几段,并相应地阅读您的问题。我不确定您是如何获得输出的。您是否希望按匹配数排序?为什么希望结果中的行
Y | Y | Y
X | B | X
?他们不符合9/10的条件?是的,对不起,他们不应该在那里。顺序才是最重要的。