首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
V2EX  ›  MySQL

被 SQL 查询男住了~

  •  
  •   cpj · 142 天前 · 5123 次点击
    这是一个创建于 142 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有三个表 TableA, TableB, TableC, 现在我的步骤是:

    1. 得到 TableA top 5 的 msid
    SELECT TOP 5 msid
    FROM TableA
    结果比如为(1, 2, 3, 4, 5)
    
    # 2. 根据 msid 得到 price 字段
    SELECT  c.price
    FROM TableC c
    LEFT JOIN TableB b
    ON c.msid=b.msid
    WHERE c.msid in (1, 2, 3, 4, 5)
    

    现在我想一起显示 c.price, a.msid 和 a 的其他字段,不知道 SQL 怎么写,而不是这样一步步来

    27 回复  |  直到 2019-05-28 16:53:19 +08:00
        1
    triptipstop   142 天前
    SELECT c.price
    FROM TableC c
    LEFT JOIN TableB b
    ON c.msid=b.msid
    WHERE c.msid in (
    SELECT TOP 5 msid
    FROM TableA
    )
        2
    lhjl1314   142 天前
    你这 table b 有啥用
        3
    cpj   142 天前
    @triptipstop 我要一起显示 c.price, a.msid, a.type 等等,不单单是 SELECT c.price
        4
    lihongjie0209   142 天前
    为什么不在代码里组装?
        5
    cpj   142 天前
    @lihongjie0209 本来打算写在代码逻辑里,但是想看看有没有 SQL 语句可以完成
        6
    gosansam   142 天前
    table b 是来搞笑的嘛
        7
    cpj   142 天前
    @lhjl1314 LEFT JOIN TableB b ON c.msid=b.msid 也可以去掉,可以去掉 TableB,但还是不知道 SQL 怎么写
        8
    cpj   142 天前
    @gosansam 我突然发现,是的...直接 copy 过来没注意...
        9
    lihongjie0209   142 天前
    @cpj 千万别有这种想法, 需求一变万一 SQL 满足不了还得重写
        10
    phpmysql   142 天前   ♥ 2
    select
    c.price, temp.*
    from
    c
    join (
    SELECT
    TOP 5 msid, *
    FROM TableA
    ) as temp on c.msid = temp.msid
        11
    yiyi11   142 天前
    楼上也可以,我这是等值连接:
    select a.*, c.*
    from TableA a,
    TableC c
    where a.msid = c.msid
    and a.msid in (SELECT TOP 5 msid FROM TableA);
        12
    hhhzccc   142 天前
    没用到 b 表的值,你左连接干啥子
        13
    chen2019   142 天前 via Android
    迫于问题过于简单,只回答,子查询
        14
    chen2019   142 天前 via Android
    然而我错了
    直接 a top5 再 join c
    应该不用子查询
        15
    greatbody   142 天前
    为什么是“男”住了?
        16
    kangzai50136   142 天前 via Android
    @greatbody 强人锁男(滑稽)
        17
    EmotionV   142 天前
    知男而上(滑稽
        18
    woshijidan   142 天前 via Android
    @kangzai50136 男♂上加男
        19
    cpj   142 天前
    @phpmysql ok 啦,感谢
        20
    cpj   142 天前
    @yiyi11
        21
    gransh   142 天前 via iPhone
    左右为男
        22
    belin520   142 天前
    男言之瘾
        23
    cpj   142 天前
    @belin520 你萌玩起来了是吧~ 那我就勉为骑男地看看
        24
    ily433664   142 天前
    男上加男
        25
    xnode   142 天前
    ♂奸男险阻、排忧解男、进退两男、迎男而解、知男而上、男上加男、勉为骑男、强人锁男、自身男抱、左右围男、覆水男收、一言男尽~[滑稽]
        26
    chirsamao   142 天前
    你应该先分析, 第一步查询的结果是作为第二步的条件的, 所以你可以将第一步的 sql 带入到第二步的条件中,即第二步前面不变,从 in 开始, in(SELECT TOP 5 msid FROM TableA ), 这样虽然效率没有 join 高,但是很有效
        27
    luanluan   142 天前
    @triptipstop 我一直想知道左关联和直接查询的方式查 有什么区别?
    @chirsamao
    @yiyi11
    各位大神指点 ,迷糊
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2725 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 12:30 · PVG 20:30 · LAX 05:30 · JFK 08:30
    ♥ Do have faith in what you're doing.