其实我也没有啥好办法,我甚至推荐你使用楼上说的方法,直接select * 将数据全部查出后,在service中用java处理数据更加方便。
如果要强行使用sql查出来,我这里写了这么一段:
首先因为是同一张表,根据不同条件将结果拼接在一起,我能想到的就是用left join,我按照不同条件将数据分成如下几段:
a段:姓名段,作为left join的主表,只有姓名;
b段:吃了早餐段;
c段:没吃早餐段;
d段:吃了晚餐段;
e段:没吃晚餐段;
f段:吃了饭段;
g段:没吃饭段。
除了a段以外,其他段都是根据自身条件
SELECT
name,
count(*) count,
sum(weight) sum,
然后依次左连接将所有段通过姓名连接到一起,最终组成的sql语句如下:
SELECT
a.name 姓名,
ifnull(b.count, 0) 吃了早餐的次数,
ifnull(b.sum, 0) 吃了早餐的重量,
ifnull(c.count, 0) 没吃早餐的次数,
ifnull(c.sum, 0) 没吃早餐的重量,
ifnull(d.count, 0) 吃了晚餐的次数,
ifnull(d.sum, 0) 吃了晚餐的重量,
ifnull(e.count, 0) 没吃晚餐的次数,
ifnull(e.sum, 0) 没吃晚餐的重量,
ifnull(f.count, 0) 吃了饭的次数,
ifnull(f.sum, 0) 吃了饭的重量,
ifnull(g.count, 0) 没吃饭的次数,
ifnull(g.sum, 0) 没吃饭的重量
FROM
(SELECT DISTINCT name
FROM T) a LEFT JOIN
(SELECT
name,
count(*) count,
sum(weight) sum
FROM T
WHERE type = 0 AND status = 0
GROUP BY name) b ON a.name = b.name
LEFT JOIN
(SELECT
name,
count(*) count,
sum(weight) sum
FROM T
WHERE type = 0 AND status = 1
GROUP BY name) c ON a.name = c.name
LEFT JOIN
(SELECT
name,
count(*) count,
sum(weight) sum
FROM T
WHERE type = 1 AND status = 0
GROUP BY name) d ON a.name = d.name
LEFT JOIN
(SELECT
name,
count(*) count,
sum(weight) sum
FROM T
WHERE type = 1 AND status = 1
GROUP BY name) e ON a.name = e.name
LEFT JOIN
(SELECT
name,
count(*) count,
sum(weight) sum
FROM T
WHERE status = 0
GROUP BY name) f ON a.name = f.name
LEFT JOIN
(SELECT
name,
count(*) count,
sum(weight) sum
FROM T
WHERE status = 1
GROUP BY name) g ON a.name = g.name
T表结构为:
(因为以name字段进行连接,type和status作为条件,建议以该三个字段作为索引)
T表测试数据为:
运行结果为:
import java.sql.Connectionimport java.sql.DriverManager
import java.sql.ResultSet
import java.sql.ResultSetMetaData
import java.sql.Statement
import java.util.Hashtable
public class GetDBFiled {
public static void conn() {
String driver = "com.mysql.jdbc.Driver"
String url = "jdbc:mysql://localhost:3306/databaseName"
String user = "root"
String password = "密码"
try {
Class.forName(driver)
Connection conn = DriverManager.getConnection(url, user, password)
if (!conn.isClosed()) {
String sql = "select * from pic"
System.out.println("Succeeded connecting to the Database!")
Statement statement =conn.createStatement()
ResultSet rs = statement.executeQuery(sql)
if (rs.next()) {
// 得到ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData()
System.out.println(rsmd.getColumnCount())
for (int i = 1 i <= rsmd.getColumnCount() i++) {
Hashtable hst = new Hashtable()
// 把字段名放入Name
String name = String.valueOf(rsmd.getColumnLabel(i))
hst.put("Name", name)
// 把字段类型放入Type
String type = String.valueOf(rsmd.getColumnType(i))
hst.put("Type", type)
System.out.println(hst.get("Name")+" "+hst.get("Type"))
}
}
}
} catch (Exception e) {
System.out.println("出现异常")
}
}
}
java程序连接MySql的主流方法是通过JDBC,你需要去MySql官网下一个他们的驱动包,然后以外部包的形式导入到项目中
建立连接
进行查询
Class.forName("com.mysql.jdbc.Driver")//DatabaseName是数据库名
Connection ct=DriverManager.getConnection("jdbc:mysql://localhost:3306/DatabaseName",username,password)
//此时就可以使用这个连接进行增删改查了
我这里贴上我以前写的一个demo的部分查询代码
PreparedStatment ps=ct.prepareStatement("select * from students where Number=?")//sql语句结尾不需要//?可以为任何类型 在函数中声明 类似ps.set类型(第几个,数据)
//sql语句可以为任何种类,第一个是从1开始
ps.setInt(1,2)
ResultSet rs=ps.executeQuery()
while(rs.next()){
int Number=rs.getInt(1)//第一个字段,顺序与sql语句查询的顺序对应,若为*则按照表中字段顺序获取
Time Time=rs.getTime(3)
String Name=rs.getString(2)
String Sex=rs.getString(4)
System.out.println("编号:"+Number+",姓名:"+Name+",出生时间:"+Time+",性别:"+Sex)
}
项目最后需要关闭连接
ct.close()欢迎分享,转载请注明来源:内存溢出
评论列表(0条)