Mysql 使用SELECT语句更新列
我需要一个查询来更新select(count)语句中的列 这就是我试过的Mysql 使用SELECT语句更新列,mysql,Mysql,我需要一个查询来更新select(count)语句中的列 这就是我试过的 SELECT m.MaidID, m.MaidJobCompleted, count(m.MaidName) as countMaidJobCompleted FROM Booking b, Maid m WHERE b.BookingMaidID like concat("%",m.MaidName,"%") and b.BookingStatus="completed" group by MaidName 获得
SELECT m.MaidID, m.MaidJobCompleted, count(m.MaidName) as countMaidJobCompleted
FROM Booking b, Maid m
WHERE b.BookingMaidID like concat("%",m.MaidName,"%")
and b.BookingStatus="completed"
group by MaidName
获得正确的结果:
MaidID MaidJobCompleted countMaidJobCompleted
329 0 5
188 0 1
281 0 8
229 0 4
MaidJobCompleted
是我创建的列(默认值为0)。
countMaidJobCompleted
是从上面的查询中获取的列
表格 女仆 预订
BookingID int(100) ,autoIncrement eg(1,2,3,4,5..)
BookingMaidID varchar(500) ,eg(Batman,Wonderwoman,Ironman)
BookingStatus varchar(50) ,eg(completed,pending..)
现在,我想通过更新查询根据“countMaidJobCompleted”更新“MaidJobCompleted”列。将
maid
表与原始查询(成为子查询)连接起来,然后使用countMaidJobCompleted
更新maid.MaidJobCompleted
列:
UPDATE maid
INNER JOIN
(SELECT m.MaidID, m.MaidJobCompleted, count(m.MaidName) as countMaidJobCompleted
FROM Booking b, Maid m
WHERE b.BookingMaidID like concat("%",m.MaidName,"%")
and b.BookingStatus="completed"
group by MaidName) t
ON maid.MaidID=t.MaidID
SET maid.MaidJobCompleted=t.countMaidJobCompleted;
首先,您应该规范化您的表。这意味着很多事情,但在您的上下文中,我看到在表Maid中,
MaidJobCompleted
列需要计算。这是不允许的。您可能会得到不同步的值(例如,新预订已完成,但计算值未更新)。但有一种方法可以确保这种情况不会发生。继续读
另一个问题是,BookingMaidID应该是Maid表中MaidID的foring键。你把名字和身份证混在一起了
我向各位提出的建议是:
女仆桌:
MaidID int(100) -- autoIncrement
MaidName varchar(200) -- some name
预订表:
BookingID int(100) -- autoIncrement
MaidID int(100) -- foreign-key to Maid:MaidID
StatusID int(100) -- foreign-key to Status:StatusID
状态表:
StatuID int(100) -- autoIncrement
StatusName varchar(200) -- some values, ex.completed,pending..
详情:
- 您不应该有需要计算的列值。如果需要,可以使用查询来执行此操作
- 添加状态表是为了确保您能够控制预订表(和应用程序)中允许的有效状态值
- 如果您需要知道所有服务员完成了多少预订,请使用以下信息:
SELECT b.MaidID, m.MaidName, COUNT(b.BookingID) FROM Booking AS b JOIN Maid AS m ON b.MaidID = m.MaidID JOIN Status AS s ON b.StatusID = s.StatusID WHERE b.StatusID = (SELECT StatusID FROM Status WHERE StatusName = 'Completed')
- 或者,如果您需要了解一个特定的女佣,请修改如下:
SELECT COUNT(b.BookingID) FROM Booking AS b JOIN Maid AS m ON b.MaidID = m.MaidID JOIN Status AS s ON b.StatusID = s.StatusID WHERE b.StatusID = (SELECT StatusID FROM Status WHERE StatusName = 'Completed') AND m.MaidName = 'THE-NAME-YOU-WANT'
- 从预订表中,您可以计算女佣完成的预订数量
- 最好显示女佣的名字,所以加入女佣表以获得名字
- 由于状态值位于它们自己的表中,因此也要连接状态表
免责声明我在这里直接输入了查询,没有对示例数据库进行测试。虽然这是可行的,但并不能解决Maid表中的规范化问题。感谢您的建议。我已经阅读了您的答案两次以上。将考虑正常化(学习和挖掘之后)。再次感谢。快速和肮脏的规范化:<代码> -/COD>不将相同的信息复制到两个表中,链接到它。代码>-没有计算值<代码>-每个对象一个表,如状态。为了避免像“完成”、“完成”、“完成”。。。仅限有效值<代码>-应始终执行标准格式1、2和3。在那之后,事情变得更复杂了。
SELECT b.MaidID, m.MaidName, COUNT(b.BookingID)
FROM Booking AS b
JOIN Maid AS m ON b.MaidID = m.MaidID
JOIN Status AS s ON b.StatusID = s.StatusID
WHERE b.StatusID = (SELECT StatusID FROM Status WHERE StatusName = 'Completed')
SELECT COUNT(b.BookingID)
FROM Booking AS b
JOIN Maid AS m ON b.MaidID = m.MaidID
JOIN Status AS s ON b.StatusID = s.StatusID
WHERE b.StatusID = (SELECT StatusID FROM Status WHERE StatusName = 'Completed')
AND m.MaidName = 'THE-NAME-YOU-WANT'