选择具有id的行,除非它具有父级,而不是选择那个

时间:2013-01-25 10:30:43

标签: php mysql

我有一个包含文章和股票信息的数据库(两个表格)。在输入文章ID时,我从文章表中选择文章,做一些其他的东西,然后查看库存表,如果文章可用。

这可能很容易SELECT * FROM articles,但是:我的articles表格中有一个字段parent_id。如果设置了,我应该选择父行。让我来说明一下:

+----+-----------+---------+---------+
| id | parent_id | article | country |
|----|-----------|---------|---------+
|  1 |           | abc     | uk      |
|  2 |           | cde     | us      |
|  3 |           | efg     | can     |
|  4 | 6         | hij     | mex     |
|  5 |           | klm     | bra     |
|  6 |           | nop     | us      |
|  7 | 8         | qrs     | mex     |
|  8 |           | tuv     | uk      |
+----+-----------+---------+---------+

如果我搜索文章abc,它应该返回国家/地区的第1行。如果我正在搜索hij,则查询应返回第6行,其中包含国家/地区而非第4行,国家/地区为mex。有没有办法在MySQL中这样做,还是更快/更好/用PHP分解两个查询的唯一方法?

4 个答案:

答案 0 :(得分:1)

您可以使用mysql IF Conditionals Mysql docs

来完成

然而,你可以迅速得到一个难以调试的恶意sql语句。你可能使用多个查询和php来更快/更容易解决。

还有另一种选择,你可以编写一个视图或存储过程来为你实现它,但又有可能带来好处。

答案 1 :(得分:1)

您可以使用LEFT外部联接:

SELECT 
    COALESCE(p.id, a.id) AS id
  , COALESCE(p.country, a.country) AS country 
FROM 
        articles AS a
    LEFT JOIN 
        articles AS p
            ON p.id = a.parent_id 
WHERE
    a.article LIKE '%hij%' ;          -- or:  a.article = 'hij'

答案 2 :(得分:0)

你可以使用MySQL if function我认为IFNULL是你追求的功能。

IFNULL(parent_id, id)

答案 3 :(得分:0)

您可以使用LEFT JOIN 选择a2.id,a2.country 来自文章a1 LEFT JOIN文章a2 ON(a2.id = a1.parent_id) WHERE a1.article ='hij';