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
cpj
V2EX  ›  MySQL

被 SQL 查询男住了~

  •  
  •   cpj ·
    cpj001 · May 28, 2019 · 8215 views
    This topic created in 2555 days ago, the information mentioned may be changed or developed.

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