douchun1948 2010-11-11 10:23
浏览 46
已采纳

mysql具有所有值

This is relating to my last question mysql query with AND, OR and NOT

Instead of editing the question, I am asking a new one because the question is only part of the previous question with an alteration.

I am looking to do a mysql query that returns me all articles that have all required topics.

Article
   id
   ....

Topic
   id
   ....

ArticleTopics
   article_id
   topic_id
   type

something that would effectively do:

SELECT * FROM Article LEFT JOIN ArticleTopics ON Article.id = ArticleTopics.article_id
WHERE ArticleTopics.topic_id HAS ALL (these topics)

Is this possible? What is the best approach for this?

  • 写回答

3条回答 默认 最新

  • dtu72460 2010-11-11 13:06
    关注

    Several of the other answers suggest using aliases on the child table for each filter clause - this may not be very efficient or scale well.

    Consider:

    SELECT x.*
    FROM Article x INNER JOIN
    (SELECT t.article_id, COUNT(t.article_id)
      FROM articleTopics t
      WHERE t.topic_id IN ([your_list_of_topics])
      GROUP BY t.article_id
      HAVING COUNT(t.article_id)>=[number of elements in [your_list_of_topics]]
      ORDER BY COUNT(t.article_id) DESC
      LIMIT 0,100) AS ilv
    ON x.id=ilv.article_id
    

    Another advantage of this approach is that the structure of the query doesn't need to change with the number of topics you are searching for - you could even put them in a temporary table and perform a join instead of using the ' IN (...)' literal.

    You'd need to try it out to see which query behaves better.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号