精易论坛

标题: 来个大佬帮忙写个SQL语句 [打印本页]

作者: aizekui    时间: 2023-9-21 18:54
标题: 来个大佬帮忙写个SQL语句
现有数据库TableA,拥有字段A,B,C,H1,H2,H3,H4,H5,H6,H7,H8,K1,K2,K3,K4,K5,K6,K7,K8帮我写一段sql语句以实现根据传入的开始和结束索引来取出对应的字段数据,比如我传入开始索引2-4,就帮我取出A,B,C,H2,H3,H4,K2,K3,K4,如果我传入1-5,就帮我取出A,B,C,H1,H2,H3,H4,H5,K1,K2,K3,K4,K5,其中C字段对应了TableC表的id,且C字段内容为1,2,3,需要使用链表cha询方法将前面所说的指定索引和TableA表的C字段对应TableC表id的数据一起取出,我使用的语言是PHP,最好能兼顾一下性能,不要一堆for循环的臃肿代码,感激不尽


作者: 1173029975    时间: 2023-9-21 19:12
gpt啊 你可以使用以下的SQL语句来实现你的需求:

sql
SELECT A, B, C,
       H1, H2, H3, H4, H5, H6, H7, H8,
       K1, K2, K3, K4, K5, K6, K7, K8
FROM TableA
WHERE C IN (SELECT id FROM TableC WHERE C IN (1, 2, 3))
LIMIT :start_index, (:end_index - :start_index + 1)
在上面的SQL语句中,:start_index 和 :end_index 是你传入的开始和结束索引。你需要将它们替换为实际的值。

这个语句通过嵌套的子cha询来先获取符合条件的C字段对应的TableC表的id,然后通过IN子句将结果与TableA表关联起来。同时,使用LIMIT语句来限制取出的记录范围。

在PHP中执行上述SQL语句可以使用PDO或mysqli等数据库操作扩展库。你可以根据自己的实际环境选择合适的方式进行cha询操作。这样可以提高性能并避免使用循环。

希望对你有所帮助!如有任何问题,请随时提问。
作者: aizekui    时间: 2023-9-21 19:19
1173029975 发表于 2023-9-21 19:12
gpt啊 你可以使用以下的SQL语句来实现你的需求:

sql

你自己瞧瞧gpt写的逻辑,这玩意没用
作者: 1377248995    时间: 2023-9-21 19:59
[SQL] 纯文本查看 复制代码

SELECT
    A, B, C, H1, H2, H3, H4, H5, H6, H7, H8, K1, K2, K3, K4, K5, K6, K7, K8
FROM
    (SELECT
        A, B, C, H1, H2, H3, H4, H5, H6, H7, H8, K1, K2, K3, K4, K5, K6, K7, K8,
            ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
    FROM
        TableA) AS temp
JOIN TableC ON temp.C = TableC.id
WHERE
    temp.rn BETWEEN 2 AND 4
ORDER BY
    temp.rn;


确保TableA表的C字段和TableC表的id字段上有索引以提高性能

补充内容 (2023-9-21 20:02):
正常还是把取字段的逻辑写代码里,
作者: 1377248995    时间: 2023-9-21 20:04
[SQL] 纯文本查看 复制代码
SELECT
    A, B, C,
    CASE
        WHEN temp.rn BETWEEN 1 AND 5 THEN H1
        ELSE NULL
    END AS H1,
    CASE
        WHEN temp.rn BETWEEN 1 AND 5 THEN H2
        ELSE NULL
    END AS H2,
    CASE
        WHEN temp.rn BETWEEN 1 AND 5 THEN H3
        ELSE NULL
    END AS H3,
    CASE
        WHEN temp.rn BETWEEN 1 AND 5 THEN H4
        ELSE NULL
    END AS H4,
    CASE
        WHEN temp.rn BETWEEN 1 AND 5 THEN H5
        ELSE NULL
    END AS H5,
    CASE
        WHEN temp.rn BETWEEN 1 AND 5 THEN K1
        ELSE NULL
    END AS K1,
    CASE
        WHEN temp.rn BETWEEN 1 AND 5 THEN K2
        ELSE NULL
    END AS K2,
    CASE
        WHEN temp.rn BETWEEN 1 AND 5 THEN K3
        ELSE NULL
    END AS K3,
    CASE
        WHEN temp.rn BETWEEN 1 AND 5 THEN K4
        ELSE NULL
    END AS K4
FROM
    (SELECT
        A, B, C, H1, H2, H3, H4, H5, K1, K2, K3, K4,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
    FROM
        TableA) AS temp
JOIN TableC ON temp.C = TableC.id
WHERE
    temp.rn BETWEEN 1 AND 5
ORDER BY
    temp.rn;

作者: aizekui    时间: 2023-9-21 20:51
1377248995 发表于 2023-9-21 20:04
[mw_shl_code=sql,true]SELECT
    A, B, C,
    CASE

如果我有100个字段呢,是不是还得写100条case
作者: 小书    时间: 2023-9-22 14:57
看懂的都是大神。




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4