Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用SELECT语句更新列_Mysql - Fatal编程技术网

Mysql 使用SELECT语句更新列

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(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
获得正确的结果:

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'