【问题标题】:mysql, order-by, check if and item is included in another table firstmysql,order-by,先检查和item是否包含在另一个表中
【发布时间】:2011-01-20 18:40:54
【问题描述】:

MySQL:

表1

+--------+-------+
| itemid | title |
+--------+-------+
|   1    | title |
+--------+-------+

表2

+----+--------+------------+
| id | itemid |    time    |
+----+--------+------------+
|  1 |    1   | 1295116368 |
+----+--------+------------+
|  1 |    2   | 1295548368 |
+----+--------+------------+
|  2 |    1   | 1294079568 |
+----+--------+------------+

PHP:

$a = mysql_query("SELECT `itemid` FROM `table2` WHERE `id` = '1' ORDER BY `time` DESC")
while($b = mysql_fetch_assoc($a))
{
    echo $b['itemid'].'<br />';
}

输出:

2
1

但是,我想要在上面的查询中做的是检查 itemid 是否也包含在 table1 中,因为当它出现时,我希望它首先出现,尽管事实上它可能是较旧的帖子。

我希望这是有道理的。

所以,输出应该是:

1
2

因为itemid = 1,也包含在table1中。

【问题讨论】:

  • 你应该避免像你一样使用相同的ID。拥有一个不能唯一标识任何东西的标识符是不合逻辑的。如果您尝试使用合理地期望 id 作为主键的 ORM,它会因为您有重复而崩溃。也就是说,我认为 Sam Dufel 对您的问题有正确的想法。

标签: php mysql join sql-order-by


【解决方案1】:

我相信你应该能够加入表格并按标题排序

SELECT itemid FROM table2
LEFT JOIN table1 USING (itemid) 
WHERE id = '1' ORDER BY title DESC, time DESC

你可能需要翻转标题的排序,我不记得 NULL 值是在开头还是结尾排序。

【讨论】:

    【解决方案2】:

    您可以通过左连接加入 table1,然后首先按 table1 的 item_id 排序,然后按 table2 上的时间:

    选择 t2.item_id FROM table2 t2 LEFT JOIN table1 t1 ON t1.item_id = t2.item_id 其中 t2.id = 1 ORDER BY IFNULL(t1.item_id, 'a') ASC, t2.time DESC

    注意:我在 order by 子句中使用 IFNULL 来使 NULL 值排在最后。

    【讨论】:

    • +1 我认为 IFNULL 很重要。否则结果集将不会像 OP 所希望的那样排序。
    【解决方案3】:

    用途:

    SELECT `itemid` FROM `table2` t2 LEFT JOIN `table1` t1
    ON t2.itemid = t1.itemid WHERE t2.`id` = '1' ORDER BY t1.itemid, t2.`time` DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-24
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多