Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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/8/variables/2.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 我可以在SQL中执行并行字段吗?_Mysql_Sql - Fatal编程技术网

Mysql 我可以在SQL中执行并行字段吗?

Mysql 我可以在SQL中执行并行字段吗?,mysql,sql,Mysql,Sql,我在MySQL数据库中有一堆X。有些X不在一起,我需要一个包含所有X对的表和一个表示它们是否正常的布尔值 这一部分很简单: CREATE TABLE good_x ( X_id_1 int(10) not null , X_id_2 int(10) not null , is_good tinyint(1) ) ; 我的问题是:给定Xsub1和Xsub3一起运行 SELECT is_good from good_x where X_id_1 = "Xsub1"

我在MySQL数据库中有一堆X。有些X不在一起,我需要一个包含所有X对的表和一个表示它们是否正常的布尔值

这一部分很简单:

CREATE TABLE good_x (
    X_id_1 int(10) not null ,
    X_id_2 int(10) not null ,
    is_good tinyint(1) 
    ) ;
我的问题是:给定Xsub1和Xsub3一起运行

SELECT is_good from good_x where X_id_1 = "Xsub1" and X_id_2 = "Xsub3" ;

但是如果数据来自Xsub3,Xsub1呢?表中可能有两个条目:

Xsub1,Xsub3,1
Xsub3,Xsub1,1
但是,你必须记住两件事。在我的例子中,这是一个受控词汇表,所以我不期望有太大的变化。但是如果我想添加第三个X,Xsub5,那么就有六个条目需要处理

Xsub1,Xsub3,Xsub5,1
Xsub1,Xsub5,Xsub3,1
Xsub3,Xsub1,Xsub5,1
Xsub3,Xsub5,Xsub1,1
Xsub5,Xsub1,Xsub3,1
Xsub5,Xsub3,Xsub1,1
这很难维持


有没有一种方法可以加入一堆X,两个或更多,并将其与布尔值相关联,这样我就不必为double、triple、quads、quint等创建单独的表。这在任何SQL中都是可能的,如果是,语法是什么?

我相信您可以使用in子句

SELECT is_good 
  from good_x 
 where X_id_1 in ("Xsub1","Xsub3","Xsub5")
   and X_id_2 in ("Xsub1","Xsub3","Xsub5") 
   and X_id_3 in ("Xsub1","Xsub3","Xsub5") ; 
如果不希望在不同的列中使用相同的值,可以添加

   and ( X_id_1 <> X_id_2
   and   X_id_1 <> X_id_3
   and   X_id_2 <> X_id_3 )
和(X_id_1 X_id_2
和X_id_1 X_id_3
和X_id_2 X_id_3)

当然,当您有太多的列或不同的值时,这并不理想。

将每个有效分组存储在如下表中:

CREATE TABLE good_x (x_id CHAR, group_id INT);
INSERT INTO good_x(x_id,group_id) values ('Xsub3',1);
INSERT INTO good_x(x_id,group_id) values ('Xsub1',1);
SELECT 1
FROM   good_x
WHERE  x_id IN ([your list of values])
GROUP BY group_id
HAVING count(1) = n;
SELECT * FROM
good_x
WHERE x_id_1 = 'Xsub1'
AND x_id_2 = 'Xsub3'
create table compatible (
  group_id number not null,
  x_id number foreign key references x(id),
  primary key (group_id, x_id)
);
create unique index ... on compatible(x_id, group_id)
使用如下分组进行播种:

CREATE TABLE good_x (x_id CHAR, group_id INT);
INSERT INTO good_x(x_id,group_id) values ('Xsub3',1);
INSERT INTO good_x(x_id,group_id) values ('Xsub1',1);
SELECT 1
FROM   good_x
WHERE  x_id IN ([your list of values])
GROUP BY group_id
HAVING count(1) = n;
SELECT * FROM
good_x
WHERE x_id_1 = 'Xsub1'
AND x_id_2 = 'Xsub3'
create table compatible (
  group_id number not null,
  x_id number foreign key references x(id),
  primary key (group_id, x_id)
);
create unique index ... on compatible(x_id, group_id)
至于第三项:

INSERT INTO good_x(x_id,group_id) values ('Xsub3',2);
INSERT INTO good_x(x_id,group_id) values ('Xsub1',2);
INSERT INTO good_x(x_id,group_id) values ('Xsub5',2);
现在运行如下选择:

CREATE TABLE good_x (x_id CHAR, group_id INT);
INSERT INTO good_x(x_id,group_id) values ('Xsub3',1);
INSERT INTO good_x(x_id,group_id) values ('Xsub1',1);
SELECT 1
FROM   good_x
WHERE  x_id IN ([your list of values])
GROUP BY group_id
HAVING count(1) = n;
SELECT * FROM
good_x
WHERE x_id_1 = 'Xsub1'
AND x_id_2 = 'Xsub3'
create table compatible (
  group_id number not null,
  x_id number foreign key references x(id),
  primary key (group_id, x_id)
);
create unique index ... on compatible(x_id, group_id)

使用当前的设计,最简单的解决方案就是确保在数据库中成对存储它们时,它们是按顺序存储的

例如,对于成对的“Xsub1”和“Xsub3”,按字母顺序存储它们。然后在搜索它们时,必须在
WHERE
子句中按字母顺序排列,如下所示:

CREATE TABLE good_x (x_id CHAR, group_id INT);
INSERT INTO good_x(x_id,group_id) values ('Xsub3',1);
INSERT INTO good_x(x_id,group_id) values ('Xsub1',1);
SELECT 1
FROM   good_x
WHERE  x_id IN ([your list of values])
GROUP BY group_id
HAVING count(1) = n;
SELECT * FROM
good_x
WHERE x_id_1 = 'Xsub1'
AND x_id_2 = 'Xsub3'
create table compatible (
  group_id number not null,
  x_id number foreign key references x(id),
  primary key (group_id, x_id)
);
create unique index ... on compatible(x_id, group_id)
这将避免重复,只需要最少的预处理


如果你不介意重新设计的话,我认为BD的解决方案更好。

如果你以某种方式订购X(例如,通过数字人工PK),你只需要存储一组X,而不是所有排列。它的成本将是在查询之前订购Xs的必要性

OTOH列出的查询“what is X compatible with”将变得更加昂贵(您将需要2个索引和2个查询)

您可以使用完全通用的解决方案,如下所示:

CREATE TABLE good_x (x_id CHAR, group_id INT);
INSERT INTO good_x(x_id,group_id) values ('Xsub3',1);
INSERT INTO good_x(x_id,group_id) values ('Xsub1',1);
SELECT 1
FROM   good_x
WHERE  x_id IN ([your list of values])
GROUP BY group_id
HAVING count(1) = n;
SELECT * FROM
good_x
WHERE x_id_1 = 'Xsub1'
AND x_id_2 = 'Xsub3'
create table compatible (
  group_id number not null,
  x_id number foreign key references x(id),
  primary key (group_id, x_id)
);
create unique index ... on compatible(x_id, group_id)

要存储任意数量的X兼容的事实,可以在
compatible
表中使用相同的任意
组id创建尽可能多的记录。通过查询它们的
组id
s并检查它们是否匹配(使用
存在
),可以有效地找到某些项是否兼容。您可以高效地找到与特定X兼容的所有内容。您不受兼容项目组大小的限制,也不关心排列。

一个好的解决方案取决于良好关系的性质和X值

如果可以对X值进行排序,则可以使用排序来存储一条记录而不是两条记录的成对关系。只要将
min(x1,x2)
存储在
x\u id\u 1
中,将
max(x1,x2)
存储在
x\u id\u 2
中即可。然后在查询对时使用相同的方法:
select。。。其中x_id_1=min(x_sub_1,x_sub_2)和x_id_2=max(x_sub_1,x_sub_2)


如果
是良好的
关系是对称的和可传递的,并且如果存在一组相当小且稳定的X值,那么另一种方法可能是使用位逻辑。每个位表示一个不同的X值,表中的每个记录都包含一个位模式,表示所有具有“1”值的X位彼此之间的关系良好。查询只需要找到设置了正确位的记录:
select。。。其中x_bitfield&my_query_bitfield=my_query_bitfield

在本例中,Xsubx是一个id,而不是数据本身。我只是想说清楚。也许你可以在查找id值之前对它们进行排序。然后只需要一行。我喜欢你这样做,它让我想起了我忘记MySQL可以做的事情,但我可能会有第三个表,x_group,然后在x_group.id上键入good_x。我喜欢。请注意,您的解决方案不仅允许存储对,还允许存储任意大小的组。也许
pair\u id
可以重命名:)我在想一定有更好的方式让所有的自连接,但不确定是否立即进行。很好。如果您在
.s/pair\u id/group\u id/s上使用
将它们更改为显式联接,则需要额外注意。“但是如果数据来自Xsub3,Xsub1呢?”我想我们需要更多地了解此过程。@BD,您的解决方案更好。我编辑了我的答案,但任何应用程序都可以重新排序参数。:)我在别的地方也这样做。成对的代码是合理的,但它不能扩展。我明白了。只是从SQL表(我创建的)推送的复杂性被推送到客户端软件(我编写的),我希望,在这种情况下,Fred Brooks是错误的,有一个银弹。在这种情况下,X是id代码,我通常将其设置为int(10)。我想我会按照BD的方式去做(在代码运行后会接受),部分原因是它更优雅地处理三元组,但我从来没有想到在查询的INSERT和WHERE部分使用min()和max()。用最好的方式说,非常刻薄。谢谢。我希望用最多五个x_ID进行相同的基本查询,所以我认为BD的方法是最好的。但这是我偶然学到的有用的SQL。非常感谢。