0

我正在尝试解决 MySQL 问题,我有两个表:

  1. CATEGORIES(列:_id,_name)
  2. POSTS(列:_id、_category、_title、_text)

_category 中的字段POSTSLONGTEXT并且可以有多个CATEGORIES_ID 仅由 分隔,使用 implode(",") PHP 函数。

我尝试用 PHP 列出 10 个最受欢迎的类别,并在 () 中显示其中的帖子,但没有运气。

我对 MySQL 不是很熟悉,我只知道如何使用 SELECT FROM WHERE ORDER LIMIT, INSERT & UPDATE 所以如果有人能给我一个好的解决方案,我会很高兴。我尝试使用 IN() 但 IN() 需要 _category 字段POSTS像这样 '1','2','3','4',现在它的 1,2,3,4 没有引号,所以如果有人知道如何在没有 FIELD TYPE SET 的情况下将此字段转换为列表,我会非常高兴。

4

4 回答 4

2

您可能希望将关系模型更改为以下内容:

带有列的表 CATEGORIES:

  • _id
  • _name

带有列的表 POSTS:

  • _id
  • _title
  • _text

带有列的 POSSESS 表:

  • post_id(外键)
  • category_id(外键)

POSSESS 关系(表)中的元组表示post_id属于该category_id类别。

于 2012-04-25T16:32:01.763 回答
0

关键词是“多对多”关系,如果可能的话,像马克贝克所写的那样重构你的方案。

于 2012-04-25T16:33:44.393 回答
0

使用 Dyin 建议的模型,您将使用类似这样的方法按受欢迎程度列出前 10 个类别(假设一个类别的帖子越多,它越受欢迎):

SELECT 
  c.*, # get all values for rows in categories
  count(p.post_id) AS post_count # here we are counting the posts for each category using a field alias for the count
FROM (
  categories AS c, # we are aliasing the tables also to shorten the typing a bit
  possess AS p     # you could also use aliases to join the same table multiple times
)
WHERE 
  c.id = p.category_id # link the categories and the possess tables
GROUP BY c.id # without this, the query would just count all posts, this way the result set is separated into groups by category
ORDER BY post_count DESC 
LIMIT 10

鉴于你所说的关于你使用 SQL 的经验,这个查询现在可能看起来有点过头了,但我认为你可以将其作为学习更多知识的起点,一如既往,谷歌是你的朋友。首先研究如何使用外键和连接来链接表。

于 2012-04-25T16:53:25.893 回答
0

我用过这个:

SELECT *, (SELECT COUNT(*) FROM offer WHERE FIND_IN_SET(type._id, offer._type)) AS _count FROM type ORDER BY _count DESC LIMIT 0, 10

现在工作正常,它的表类型(列:_id,_name)和报价(列:..,..,_types,

于 2012-04-26T22:41:54.123 回答