我已经尝试解决这个问题有一段时间了——我正在进行模拟(用 PHP 运行,因为我讨厌自己)。我已经完成了可以开始添加“病毒”等内容的工作。
现在,我正在研究一种限制公民生育能力的“病毒”——除了确定他们是否“不育”的实际方法之外,我已经让一切都完美运行。
我正在尝试使用与此类似的查询从数据库中提取数据(注意此查询半工作,但我不知道如何使其正常工作):
SELECT g.infert1 as gert,
v.infert1 as vert
FROM genetics as g,
virus as v,
citizens as c
WHERE c.cid = 1
AND g.cid = c.cid
AND v.vid = c.infected
GERT 和 VERT 数据关联到两个表(遗传学和病毒)。病毒表包含大部分与遗传学表相同的行(Imm00-12、infert1 等)。如果“公民”被感染,两组数据都会正确选择,但如果没有,则结果返回 null 并导致错误。
我试图弄清楚是否有一种方法可以获取条件数据,如果公民没有被感染,它仍然会选择 GERT 信息,并为 VERT 返回 null,而不是根本不返回任何内容。
最佳答案
请尝试以下操作...
SELECT genetics.infert1 AS gert,
virus.infert1 AS vert
FROM citizens
JOIN genetics ON citizens.cid = genetics.cid
LEFT JOIN virus ON virus.vid = citizens.infected
WHERE citizens.cid = 1;
该语句首先执行 INNER JOIN
之间citizens
和genetics
基于它们的共同值 cid
。这有效地前置了 citizen
的字段给 genetics
的人对于每个 citizen
.
然后它执行 LEFT JOIN
在这个连接的数据集和病毒之间,其中 virus.vid = citizens.infected
。这具有附加 virus
字段值的效果。那一个citizen
受此困扰 citizen
到 genetics
中的每条记录为此citizen
。如果citizen
不受 virus
的困扰,然后NULL
值用于 virus
字段。
然后将生成的数据集精炼为仅包含 citizens.cid
值的记录。是 1
.
如果您希望为所有人生成相同的列表 citizens
,然后删除 WHERE
条款。
使用INNER JOIN
和LEFT JOIN
与使用 CROSS JOIN
相比,这是一种更现代、更高效的加入方式。由 WHERE
精制而成条款。一个CROSS JOIN
两个表之间,使用 tblTable1, tblTable2
执行附加 tblTable2
中每条记录的副本到 tblTable
中的每条记录。然后通过 WHERE
细化生成的(通常非常大)数据集。条款。与INNER JOIN
和LEFT JOIN
仅那些满足 ON
的记录标准被加入,这通常要快得多。
如果您有任何问题或意见,请随时发表评论。
关于mysql - 即使条件不是我,也选择一些数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43690890/