【问题标题】:Getting info from many tables从许多表中获取信息
【发布时间】:2012-03-13 20:19:18
【问题描述】:

我有 4 个表:question_tags、tags、questions 和 users。

问题结构为:q_id, q_title, q_content, q_date, q_author(id 来自用户表)。

标签结构为:tag_id、tag_name、tag_description。

Question_tags 结构为:id、tag_id、q_id。

我想列出所有问题并在要显示的每个问题标题及其标签旁边。到目前为止,我已经想出了这个:

$this->db->join('users', 'q_author = users.id', 'left');
$this->db->order_by('q_id', 'desc');
$this->db->limit($per_page, $offset);
$query = $this->db->get('questions');

但对标签一无所知。 (我也在使用 CodeIgniter)

附:每个问题可以有多个标签。

数据库表标签codeigniter-2

【问题讨论】:

  • 我认为您可以尝试在question.q_id=question_tags.q_idquestion_tags.tag_id=tags.tag_idGROUP BY(q_id) 之间使用左联接选择GROUP_CONCAT(tag_name)(我可以在MySQL 中编写查询,但不要知道它是如何在 codeigniter 中完成的)。这将返回您的信息和每个问题的以逗号分隔的标签名称列表。
  • 我试过这个:SELECT *, GROUP_CONCAT(tags.tag_name) FROM questions LEFT JOIN users ON q_author = users.id LEFT JOIN question_tags ON questions.q_id=question_tags.q_id LEFT JOIN tags ON questions.q_id = question_tags.q_id GROUP BY questions.q_id,但它返回所有标签,而不是这个问题的标签。我的错在哪里?
  • 第二个LEFT JOIN(到tags)应该是ON tags.tag_id = questions_tags.tag_id
  • 感谢您的想法!我终于想出了这个:SELECT * , GROUP_CONCAT( tags.tag_name ) FROM questions LEFT JOIN users ON q_author = users.id LEFT JOIN question_tags ON questions.q_id = question_tags.q_id LEFT JOIN tags ON tags.tag_id = question_tags.tag_id GROUP BY questions.q_id
  • 请记住 group_concat 的默认限制 (1024),如果某些问题标签超过该限制,您可能会修剪数据:)

标签: php database codeigniter-2


【解决方案1】:

如果您想避免在主查询中返回重复数据,您需要有不同的查询。因为您有许多与每个问题相关的标签,所以您应该遍历您的问题结果,并在每次循环迭代中查询该问题的标签。

【讨论】:

    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2011-01-05
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多