我从三个表中获取数据时遇到问题,我希望使用一个查询返回这些表。 在使用像这样的查询之前我已经完成了这个:
$query = mysql_query("SELECT
maintable.`id`,
maintable.`somedata`,
maintable.`subtable1_id`,
subtable1.`somedata`,
subtable1.`subtable2_id`,
subtable2.`somedata`
FROM
`maintable` maintable,
`subtable1` subtable1,
`subtable2` subtable2
WHERE
maintable.`somedata` = 'some_search' AND
subtable1.`id` = maintable.`subtable1_id` AND
subtable2.`id` = subtable1.`subtable2_id`
")or die(mysql_error());
这次的问题是额外的细节可能实际上并不适用。我需要返回与maintainble中的some_search匹配的所有结果,即使没有指定subtable1_id。
我需要一些符合
的内容WHERE
maintable.`somedata` = 'some_search'
AND IF maintable.`subtable1_id` IS NOT NULL (
WHERE subtable1.`id` = maintable.`subtable1_id` AND
subtable2.`id` = subtable1.`subtable2_id`
)
你可能会猜到,我不是一个高级的mysql用户!尽我所能,我无法正确使用语法,而且我没有在网上搜索解决方案。
非常感谢任何帮助!
答案 0 :(得分:2)
您正在寻找的基本区别似乎是在MySQL中的 INNER JOIN 和 LEFT JOIN 之间。
INNER JOIN需要两个表之间的引用。要返回的行,两边必须匹配。
LEFT JOIN将返回两行中的匹配项,如INNER,但即使在辅助表中没有行匹配,它也将返回主表中的行 - 它们的字段将为NULL。
答案 1 :(得分:1)
如果我做对了,你需要使用MySQL LEFT
JOIN。试试这个:
SELECT
m.id,
m.somedata,
m.subtable1_id,
s1.somedata,
s1.subtable2_id,
s2.somedata
FROM
maintable m
LEFT JOIN
subtable1 s1
ON
m.subtable1_id = s1.id
LEFT JOIN
subtable2 s2
ON
s1.subtable2_id = s2.id
WHERE
m.somedata = 'some search'
这将返回维护数据,即使subtable1或2中没有等效数据,如果subtable2中没有等效数据,则维护和subtable1的数据也是如此。
答案 2 :(得分:0)
这个怎么样:
WHERE
maintable.`somedata` = 'some_search'
AND (maintable.`subtable1_id` IS NULL OR (
subtable1.`id` = maintable.`subtable1_id` AND
subtable2.`id` = subtable1.`subtable2_id` )
)
请记住,当subtable1_id为NULL时,这将导致subtable1和subtable2的叉积与维护。