即使辅助表不适用,也从一个查询中的多个表返回数据

时间:2010-09-26 18:19:46

标签: php mysql

我从三个表中获取数据时遇到问题,我希望使用一个查询返回这些表。 在使用像这样的查询之前我已经完成了这个:

$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用户!尽我所能,我无法正确使用语法,而且我没有在网上搜索解决方案。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

您正在寻找的基本区别似乎是在MySQL中的 INNER JOIN LEFT JOIN 之间。

INNER JOIN需要两个表之间的引用。要返回的行,两边必须匹配。

LEFT JOIN将返回两行中的匹配项,如INNER,但即使在辅助表中没有行匹配,它也将返回主表中的行 - 它们的字段将为NULL。

You can find example syntax in the docs

答案 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的叉积与维护。