我已经尝试了一段时间了--我正在做一个模拟(用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.infectedGERT和Virus数据关联到两个表(遗传学和病毒)。病毒表包含与遗传学表(Imm00-12、infert1等)相同的大多数行。如果“公民”被感染,这两组数据都会正确选择,但是如果没有,则结果返回null并导致错误。
我试图找出是否有一种获得条件数据的方法,如果一个公民没有被感染,它仍然会选择GERT信息,只返回null,而不是返回任何东西。
发布于 2017-04-29 02:55:44
请试试看..。
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;该语句首先根据citizens和genetics的公共值cid在它们之间执行cid。这有效地为每个citizen的字段加上了genetics字段。
然后,它在连接的数据集和virus.vid = citizens.infected所在的病毒之间执行一个virus.vid = citizens.infected。这样做的效果是将virus字段的值与该citizen的字段一起附加到来自genetics的该citizen的每个记录中。如果citizen不受virus影响,则对virus字段使用NULL值。
然后,将结果数据集细化为citizens.cid值为1的那些记录。
如果希望为所有citizens生成相同的列表,则删除WHERE子句。
使用INNER JOIN和LEFT JOIN是一种比使用WHERE子句细化的CROSS JOIN更现代和更有效的连接方式。使用tblTable1, tblTable2执行的两个表之间的CROSS JOIN将每个记录的副本从tblTable2附加到tblTable的每个记录。结果(通常是非常大的)数据集通过WHERE子句进行细化。对于INNER JOIN和LEFT JOIN,只有那些符合ON条件的记录才会被连接起来,这通常要快得多。
如果您有任何问题或意见,请随时发表相应的评论。
发布于 2017-04-29 02:29:45
这样的东西可能就是你想要的。
SELECT g.infert1 as gert,
cv.vert as vert
FROM
genetics as g
LEFT JOIN
( SELECT c.cid as cid, v.infert1 as vert
FROM virus as v
INNER JOIN citizens as c ON v.vid = c.infected
WHERE c.cid = 1
) AS cv
ON g.cid = cv.cid在这里,我使用SQL语法:
你可能希望重新评估公民是否只能感染一种病毒。
https://stackoverflow.com/questions/43690890
复制相似问题