Sql 至少具有给定ID的家长。如果希望它具有完全相同的ID(即没有额外的ID),则必须稍微更改查询 这正是我写的,只是写得不同而已。因为我误解了这个问题。嗯。。。看来我的第一个猜测是对的。。。你甚至不需要区分。最好的答案可以通过测试而不是投票来确定,这很好。谢谢

Sql 至少具有给定ID的家长。如果希望它具有完全相同的ID(即没有额外的ID),则必须稍微更改查询 这正是我写的,只是写得不同而已。因为我误解了这个问题。嗯。。。看来我的第一个猜测是对的。。。你甚至不需要区分。最好的答案可以通过测试而不是投票来确定,这很好。谢谢,sql,mysql,join,left-join,Sql,Mysql,Join,Left Join,至少具有给定ID的家长。如果希望它具有完全相同的ID(即没有额外的ID),则必须稍微更改查询 这正是我写的,只是写得不同而已。因为我误解了这个问题。嗯。。。看来我的第一个猜测是对的。。。你甚至不需要区分。最好的答案可以通过测试而不是投票来确定,这很好。谢谢,cletus。这证明了有时候非泛型查询比泛型查询更好,当然,你也不总是可以友好地创建查询。这正是我所说的,只是写得不同而已。是的。因为我误解了这个问题。嗯。。。看来我的第一个猜测是对的。。。你甚至不需要区分。最好的答案可以通过测试而不是投票来

至少具有给定ID的家长。如果希望它具有完全相同的ID(即没有额外的ID),则必须稍微更改查询



这正是我写的,只是写得不同而已。因为我误解了这个问题。嗯。。。看来我的第一个猜测是对的。。。你甚至不需要区分。最好的答案可以通过测试而不是投票来确定,这很好。谢谢,cletus。这证明了有时候非泛型查询比泛型查询更好,当然,你也不总是可以友好地创建查询。这正是我所说的,只是写得不同而已。是的。因为我误解了这个问题。嗯。。。看来我的第一个猜测是对的。。。你甚至不需要区分。最好的答案可以通过测试而不是投票来确定,这很好。谢谢你,cletus。这证明了有时候非泛型查询比泛型查询好,当然也不总是你可以通过友好的方式创建查询。嗯,这是可行的。我认为这比我现在看到的更混乱,但可能更明显。子查询中的UNION=非常非常糟糕。不要这样做。这并不漂亮,但是生成它的代码很简单,我怀疑当你有很多父母的时候,你会看到一个很大的性能改进。如果你尝试了,用你的结果来评论——我很好奇。克莱特斯——真的吗?我知道Oracle不在乎,但我确实有一些在MySQL中使用子查询的痛苦经历。。它做了什么让事情变得糟糕?甲骨文没有?呃,我曾经研究过被联合会和联合会所有使用方式完全破坏的系统……嗯,那可以工作。我认为这比我现在看到的更混乱,但可能更明显。子查询中的UNION=非常非常糟糕。不要这样做。这并不漂亮,但是生成它的代码很简单,我怀疑当你有很多父母的时候,你会看到一个很大的性能改进。如果你尝试了,用你的结果来评论——我很好奇。克莱特斯——真的吗?我知道Oracle不在乎,但我确实有一些在MySQL中使用子查询的痛苦经历。。它做了什么让事情变得糟糕?甲骨文没有?呃,我研究的系统完全被工会和工会的使用所破坏…非常好的主意。。。现在尝试与SQL语句的其余部分集成…hmmmWarning:在继续之前,如果您希望有不同数量的子项,那么阅读此解决方案(使用聚合)比多次选择更有效。将id添加到IN列表比使用SELECT per id添加条件更具可读性且可能更高效。在任何情况下,请检查查询计划以比较查询…非常好的主意。。。现在尝试与SQL语句的其余部分集成…hmmmWarning:在继续之前,如果您希望有不同数量的子项,那么阅读此解决方案(使用聚合)比多次选择更有效。将id添加到IN列表比使用SELECT per id添加条件更具可读性,也可能更高效。在任何情况下,请检查查询计划以比较查询…为什么我会对测试的工作查询投反对票?(至少你可以解释它有什么问题)不是我,但可能是因为它几乎完全一样:嗯,当我在MSSQL Studio中构建它时,我不知道发布了类似的答案,但这并不是投反对票的原因。我会给你一个向上的票,使其为0…尽管它仍然给你更多的代表性。谢谢,为了明确代表不是问题所在,我来这里是为了了解我的答案是否有误,我只想知道问题出在哪里。为什么我会对一个测试过的工作查询投反对票?(至少你可以解释它有什么问题)不是我,但可能是因为它几乎完全一样:嗯,当我在MSSQL Studio中构建它时,我不知道发布了类似的答案,但这并不是投反对票的原因。我会给你一个向上的票,使其为0…尽管它仍然给你更多的代表性。谢谢,我只是想说明,销售代表不是问题所在,我来这里是想了解,如果我的答案有误,我只想知道是什么错了。
CREATE TABLE `parent` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `parent` VALUES(1, 'parent 1');
INSERT INTO `parent` VALUES(2, 'parent 2');

CREATE TABLE `other` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `other` VALUES(1, 'other 1');
INSERT INTO `other` VALUES(2, 'other 2');

CREATE TABLE `relationship` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) NOT NULL,
  `other_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `relationship` VALUES(1, 1, 1);
INSERT INTO `relationship` VALUES(2, 1, 2);
INSERT INTO `relationship` VALUES(3, 2, 1);
SELECT p.id, p.name
FROM parent AS p
    LEFT JOIN relationship AS r1 ON (r1.parent_id = p.id)
    LEFT JOIN relationship AS r2 ON (r2.parent_id = p.id)
WHERE r1.other_id = 1 AND r2.other_id = 2;
SELECT p.id, name
FROM parent p
JOIN relationship r1 ON p.id = r1.parent_id AND r1.other_id = 100
JOIN relationship r2 ON p.id = r2.parent_id AND r2.other_id = 101
JOIN relationship r3 ON p.id = r3.parent_id AND r3.other_id = 102
JOIN relationship r4 ON p.id = r4.parent_id AND r4.other_id = 103
SELECT id, name
FROM parent p
WHERE EXISTS (SELECT 1 FROM relationship WHERE parent_id = p.id AND other_id = 100)
AND EXISTS (SELECT 1 FROM relationship WHERE parent_id = p.id AND other_id = 101)
AND EXISTS (SELECT 1 FROM relationship WHERE parent_id = p.id AND other_id = 102)
AND EXISTS (SELECT 1 FROM relationship WHERE parent_id = p.id AND oth
SELECT id, name FROM (
  SELECT p1.id, p1.name
  FROM parent AS p1 LEFT JOIN relationship as r1 ON(r1.parent_id=p1.id)
  WHERE r1.other_id = 100
  UNION ALL
  SELECT p2.id, p2.name
  FROM parent AS p2 LEFT JOIN relationship as r2 ON(r2.parent_id=p2.id)
  WHERE r2.other_id = 101
  UNION ALL
  SELECT p3.id, p3.name
  FROM parent AS p3 LEFT JOIN relationship as r3 ON(r3.parent_id=p3.id)
  WHERE r3.other_id = 102
  UNION ALL
  SELECT p4.id, p4.name
  FROM parent AS p4 LEFT JOIN relationship as r4 ON(r4.parent_id=p4.id)
  WHERE r4.other_id = 103
) a
GROUP BY id, name
HAVING count(*) = 4
CREATE INDEX ON relationship (parent_id, other_id)
CREATE TABLE parent (
  id INT PRIMARY KEY,
  name VARCHAR(50)
);

CREATE TABLE other (
  id INT PRIMARY KEY,
  name VARCHAR(50)
);

CREATE TABLE relationship (
  id INT PRIMARY KEY,
  parent_id INT,
  other_id INT
);

CREATE INDEX idx1 ON relationship (parent_id, other_id);
CREATE INDEX idx2 ON relationship (other_id, parent_id);
<?php
ini_set('max_execution_time', 600);

$start = microtime(true);

echo "<pre>\n";
mysql_connect('localhost', 'scratch', 'scratch');
if (mysql_error()) {
    echo "Connect error: " . mysql_error() . "\n";
}
mysql_select_db('scratch');
if (mysql_error()) {
    echo "Selct DB error: " . mysql_error() . "\n";
}

define('PARENTS', 100000);
define('CHILDREN', 100000);
define('MAX_CHILDREN', 10);
define('SCATTER', 10);
$rel = 0;
for ($i=1; $i<=PARENTS; $i++) {
    query("INSERT INTO parent VALUES ($i, 'Parent $i')");
    $potential = range(max(1, $i - SCATTER), min(CHILDREN, $i + SCATTER));
    $elements = sizeof($potential);
    $other = rand(1, min(MAX_CHILDREN, $elements - 4));
    $j = 0;
    while ($j < $other) {
        $index = rand(0, $elements - 1);
        if (isset($potential[$index])) {
            $c = $potential[$index];
            $rel++;
            query("INSERT INTO relationship VALUES ($rel, $i, $c)");
            unset($potential[$index]);
            $j++;
        }
    }
}
for ($i=1; $i<=CHILDREN; $i++) {
    query("INSERT INTO other VALUES ($i, 'Other $i')");
}

$count = PARENTS + CHILDREN + $rel;
$stop = microtime(true);
$duration = $stop - $start;
$insert = $duration / $count;

echo "$count records added.\n";
echo "Program ran for $duration seconds.\n";
echo "Insert time $insert seconds.\n";
echo "</pre>\n";

function query($str) {
    mysql_query($str);
    if (mysql_error()) {
        echo "$str: " . mysql_error() . "\n";
    }
}
?>
SELECT id, name FROM (
  SELECT p1.id, p1.name
  FROM parent AS p1 LEFT JOIN relationship as r1 ON(r1.parent_id=p1.id)
  WHERE r1.other_id = 1
  UNION ALL
  SELECT p2.id, p2.name
  FROM parent AS p2 LEFT JOIN relationship as r2 ON(r2.parent_id=p2.id)
  WHERE r2.other_id = 2
   -- etc
) GROUP BY id, name
HAVING count(*) = 2
select p.id, p.name 
  from parent as p 
 where (select count(*) 
        from relationship as r 
       where r.parent_id = p.id 
         and r.other_id in (1,2)
        ) >= 2
SELECT * FROM parent p
WHERE p.id in(
    SELECT r.parent_Id 
    FROM relationship r 
    WHERE r.parent_id in(1,2) 
    GROUP BY r.parent_id
    HAVING COUNT(r.parent_Id)=2
)
SELECT
     p.id,
     p.name
FROM
     My_Other_IDs MOI
INNER JOIN Relationships R ON
     R.other_id = MOI.other_id
INNER JOIN Parents P ON
     P.parent_id = R.parent_id
GROUP BY
     p.parent_id,
     p.name
HAVING
     COUNT(*) = (SELECT COUNT(*) FROM My_Other_IDs)