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
Sponsored by
LinkedIn
2000 个不用坐班的远程好工作在召唤你 · 弹性上班不打卡,工作和生活都能拥有
2000 个不用坐班的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
cpj
V2EX  ›  MySQL

被 SQL 查询男住了~

  •  
  •   cpj ·
    cpj001 · 2019-05-28 11:22:23 +08:00 · 6822 次点击
    这是一个创建于 1216 天前的主题,其中的信息可能已经有所发展或是发生改变。

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