首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询所有组合中6个数字的6个不同列( sql )

查询所有组合中6个数字的6个不同列( sql )
EN

Stack Overflow用户
提问于 2016-08-14 20:20:26
回答 4查看 149关注 0票数 0

我有一个6列的数据库,n1 - n6。每个行都有一个数字,因此每一行都有6个不同的数字。当我查询时,我要检查我必须针对数据库中的每一行提交的6个数字。我需要查询来改变组合,所以在理论上,36个查询是完成的。

因此,一个示例数据集可能是

代码语言:javascript
复制
N1  N2  N3  N4  N5  N6
1   12  54  36  17  23

我必须对此查询的数字是

1 54 36 17 23 12

因此,它们是相同的,但由于它们的顺序不同,所以不会返回结果。所有6点必须匹配才能返回正数。

示例查询:

代码语言:javascript
复制
$sql = "SELECT * FROM numbers WHERE n1 = :n1 AND n2 = :n2 AND n3 = :n3 AND n4 = :n4 AND n5 = :n5 AND n6 = :n6";
$stmt = $conn->prepare($sql);
$stmt->bindParam(":n1", $n1);
$stmt->bindParam(":n2", $n2);
$stmt->bindParam(":n3", $n3);
$stmt->bindParam(":n4", $n4);
$stmt->bindParam(":n5", $n5);
$stmt->bindParam(":n6", $n6);
$stmt->execute();

我可以用36个不同的查询来完成这个任务,但是能够在一个查询中完成这个任务就更有用了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-14 20:51:33

嗯嗯。。。将六个数字存储在一行中听起来像是一种糟糕的数据格式。如果这些是行而不是列,那么就更容易了。

但是,假设没有重复,您可以:

代码语言:javascript
复制
SELECT *
FROM numbers
WHERE n1 IN (:n1, :n2, :n3, :n4, :n5, :n6) AND
      n2 IN (:n1, :n2, :n3, :n4, :n5, :n6) AND
      n3 IN (:n1, :n2, :n3, :n4, :n5, :n6) AND
      n4 IN (:n1, :n2, :n3, :n4, :n5, :n6) AND
      n5 IN (:n1, :n2, :n3, :n4, :n5, :n6) AND
      n6 IN (:n1, :n2, :n3, :n4, :n5, :n6);
票数 1
EN

Stack Overflow用户

发布于 2016-08-14 21:00:20

代码语言:javascript
复制
CREATE TABLE YourTable (n1 INT, n2 INT, n3 INT, n4 INT, n5 INT, n6 INT);
INSERT INTO YourTable (n1,n2,n3,n4,n5,n6)
VALUES (1,12,54,36,17,23);

CREATE TABLE ValuesTable (Id INT NOT NULL AUTO_INCREMENT,Value INT, primary key(id));
INSERT INTO ValuesTable (Value) VALUES (1),(12),(54),(36),(17),(23);

SELECT t.*
FROM
    YourTable t
    INNER JOIN (
       SELECT
          v1.Value as n1
          ,v2.Value as n2
          ,v3.Value as n3
          ,v4.Value as n4
          ,v5.Value as n5
          ,v6.Value as n6
       FROm
          ValuesTable v1
          INNER JOIN ValuesTable v2
          ON v1.Id <> v2.Id
          INNER JOIN ValuesTable v3
          ON v1.Id <> v3.Id
          AND v2.Id <> v3.Id
          INNER JOIN ValuesTable v4
          ON v1.Id <> v4.Id
          AND v2.Id <> v4.Id
          AND v3.Id <> v4.Id
          INNER JOIN ValuesTable v5
          ON v1.Id <> v5.Id
          AND v2.Id <> v5.Id
          AND v3.Id <> v5.Id
          AND v4.Id <> v5.Id
          INNER JOIN ValuesTable v6
          ON v1.Id <> v6.Id
          AND v2.Id <> v6.Id
          AND v3.Id <> v6.Id
          AND v4.Id <> v6.Id
          AND v5.Id <> v6.Id
    ) v
    ON t.n1 = v.n1
    AND t.n2 = v.n2
    AND t.n3 = v.n3
    AND t.n4 = v.n4
    AND t.n5 = v.n5
    AND t.n6 = v.n6
;

通过使用6个内部联接将6个数字添加到一个表/临时表中,并在表上自动增加,您可以生成所有排列(6个阶乘或720个组合),然后将其内部连接到您的表中,并获得所需的结果。通过使用Id字段,它将允许在列表中重复编号,例如1、12、12、.。

另一种选择是通过将所有列组合成单个列来重新排序表本身,然后可以将表连接到6个值的临时表上,然后计数以确保6连接,或者可以重新排序列并使用条件聚合将其重新组合到列中,并按照列表中的相同顺序进行测试。

票数 0
EN

Stack Overflow用户

发布于 2016-08-14 21:30:37

假设您有重复项,并且有一个主键(在下面的示例中是id):

代码语言:javascript
复制
select a.* from numbers a
inner join 
(select id, group_concat(n order by n asc separator ' ') as n from (
  select id, n1 as n from numbers
  union all
  select id, n2 as n from numbers
  union all
  select id, n3 as n from numbers
  union all
  select id, n4 as n from numbers
  union all
  select id, n5 as n from numbers
  union all
  select id, n6 as n from numbers
) b group by id) c on a.id = c.id 
where c.n = '1 12 17 23 36 54';

唯一的要求是您正在查询的数字被连接成一个具有升序的字符串。

SQL Fiddle中的示例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38946261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档