mysql - 即使条件不是我,也选择一些数据

标签 mysql sql

我已经尝试解决这个问题有一段时间了——我正在进行模拟(用 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之间citizensgenetics基于它们的共同值 cid 。这有效地前置了 citizen 的字段给 genetics 的人对于每个 citizen .

然后它执行 LEFT JOIN在这个连接的数据集和病毒之间,其中 virus.vid = citizens.infected 。这具有附加 virus 字段值的效果。那一个citizen受此困扰 citizengenetics 中的每条记录为此citizen 。如果citizen不受 virus 的困扰,然后NULL值用于 virus字段。

然后将生成的数据集精炼为仅包含 citizens.cid 值的记录。是 1 .

如果您希望为所有人生成相同的列表 citizens ,然后删除 WHERE条款。

使用INNER JOINLEFT JOIN与使用 CROSS JOIN 相比,这是一种更现代、更高效的加入方式。由 WHERE 精制而成条款。一个CROSS JOIN两个表之间,使用 tblTable1, tblTable2 执行附加 tblTable2 中每条记录的副本到 tblTable 中的每条记录。然后通过 WHERE 细化生成的(通常非常大)数据集。条款。与INNER JOINLEFT JOIN仅那些满足 ON 的记录标准被加入,这通常要快得多。

如果您有任何问题或意见,请随时发表评论。

关于mysql - 即使条件不是我,也选择一些数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43690890/

相关文章:

javascript - LZ 字符串压缩文本的 Mysql 数据类型

php - 如果我删除所有特殊字符,Sql 注入(inject)的机会?

mysql - LEFT JOIN 上的 MAX() 值

sql - 按sql server中最近的时差排序

sql - 使用来自多个类别的数据连接表格

MySQL 和日期时间

php - 内连接 : where clause is too ambiguous

mysql - 与 phpmyadmin 相比,$wpdb->get_results 查询返回不同(错误)的结果

php - 如何保存回显到 session 中的表?

sql - 从 URL 中提取主机名