鍍金池/ 問答/ 數(shù)據(jù)庫問答
幼梔 回答

mysqli:

<?php

$timezone="Asia/Shanghai";
date_default_timezone_set($timezone);

$host="localhost";
$db_user="sucaishui";//數(shù)據(jù)庫帳號
$db_pass="123456";//數(shù)據(jù)庫密碼
$db_name="xiaochengxu";//數(shù)據(jù)庫名

$db = new mysqli($host, $db_user, $db_pass, $db_name);
if ($db -> connect_errno) {
    error_log('[連接失敗][ ' . $db -> connect_error . ' ]');
}
$db -> query('SET NAMES utf8');

PDO:

<?php

$timezone="Asia/Shanghai";
date_default_timezone_set($timezone);

$host="localhost";
$db_user="sucaishui";//數(shù)據(jù)庫帳號
$db_pass="123456";//數(shù)據(jù)庫密碼
$db_name="xiaochengxu";//數(shù)據(jù)庫名

$dsn = "mysql:dbname={$db_name};host={$host}";

try {
    $db = new PDO($dsn, $db_user, $db_pass);
} catch (PDOException $e) {
    error_log('[連接失敗][ ' . $e -> getMessage() . ' ]');
}
$db -> exec('SET NAMES utf8');

大概是這樣?

真難過 回答

圖片描述

使用set去改變數(shù)組

拮據(jù) 回答
select a.name, b.total from mer_content a 
inner join
(select id, count(url) as total from mer_imgurl group by id) b
on a.id = b.id

就是把表二先按做個group,再和表一用id來join。
如果表二的id和url會有重復(fù)情況的話,那么b中需要改成count(distinct url)

希望能夠幫到你。

維她命 回答

線程框架的一個重要議題就是線程通信模型,而EDA(Event-Driven Architecture)是一種實現(xiàn)組件之間松耦合、易擴(kuò)展的更高維度的架構(gòu)方式,我寫過個一個線程相關(guān)的項目其中就有這一塊的東西
package com.echo.code.thread.mode.eventloop

撥弦 回答

對于1,可能有安全問題,但怎么處理要具體分析,過濾也不好處理??赡苄枰~外的手段讓富文本部分僅僅是顯示,而不會有太多執(zhí)行的部分。

北城荒 回答

把 composer.lock 刪除了試試重新執(zhí)行試試, 或者用phpstorm一類的IDE將composer.lock 文件轉(zhuǎn)為UTF-8 字符編碼再試試

雨蝶 回答

為何不在b表增加一個max_created_at字段

瘋子范 回答

都是單表查詢沒什么問題,應(yīng)該這樣處理,你所說的效率無非是mysql的瓶頸問題,和服務(wù)端的語言沒什么關(guān)系,評論的話怎么取,這要看你的業(yè)務(wù)了,這里你要注意這么幾點
1、當(dāng)你的翻頁功能只能一頁一頁翻,那么可以取當(dāng)頁的最后一條數(shù)據(jù)的id,使用where id > last_id 這樣的行級過濾條件,limit這里只需要 limit page_size就可以了,mysqllimit 有個問題,就是你如果寫limit 100000 10 它會把這100000 條數(shù)據(jù)都檢索一遍。這樣寫的好處就是你設(shè)置了一個過濾條件,那么他其實只會檢索你設(shè)置的page_size 的數(shù)據(jù)條數(shù),其次是你可以寫多個條件。
2、如果你是單條件查詢,那么可以使用子查詢,就是在where 行級過濾條件里使用 子查詢,比如說 select * from table1 where id > (select id from table1 limit current_num, page_size) limit page_size,這里子查詢走的主鍵索引,所以說速度是很快的。
3、當(dāng)涉及單條件和多條件查詢的時候,組合索引非常重要,比如 select id from table1 where age > 18, 這里索引會先走where 條件 再走 id,所以按照組合索引的最左原則,你懂得。
4、之后用 In() 取另一張表的數(shù)據(jù)即可,其實也就查詢兩次數(shù)據(jù)庫,剩下的交給服務(wù)端處理一下就完事了。
5、能設(shè)置定長的字段可以盡量設(shè)置為定長。

還要說一點的是,其實當(dāng)數(shù)據(jù)量真的很大的時候,其實會用分表,索引表,分段查詢這些東西來做select 操作,有的可能會用sphinx、Solr 這些全文檢索引擎。你可以取研究研究

賤人曾 回答

自己找到方法了,解決了,代碼如下。

$conditions = array(
    'id' => $id
);

$extra = array(
...
);
  
$service = RecordModel::firstOrNew($conditions);
$service->extra = $extra;    
$service->save();

另外這個方法會自動把沒有變化的字段去掉,只更新有變化的字段,如果待更新的字段全部未變化則不進(jìn)行Mysql更新操作。

亮瞎她 回答

幾千條數(shù)據(jù),效率不會太差吧,注意把比較是否存在的字段加上索引就行了。

如果確實數(shù)據(jù)量大(最少也幾十萬級別),可以考慮用批量加載的方式先插入到臨時表,然后用sql語句做后續(xù)的更新或插入操作。

墨小羽 回答

寫成兩列不就完了。。
select
sid,api,
sum(case when flag=0 then count else 0 end) count1,
sum(case when flag=1 then count else 0 end) count2
from table
group by sid,api;

風(fēng)畔 回答

集合名.findByIdAndUpdate(id, {$set: {新數(shù)據(jù)}}).then(res=>{})

葬愛 回答

case g.type when 1 then ()

還吻 回答

你看到的紅色正方形被瀏覽器窗口截斷了!你把#app的margin-top調(diào)的高一些再看,比如200px,會是如下效果

clipboard.png

有沒有發(fā)現(xiàn)什么?紅色正方形的中心卡在了容器邊緣,正好被平分。接下來我們解釋為什么會這樣。
  1. height:100%這類屬性是相對父元素的, d1高度為0,d2雖然設(shè)定高度100%,結(jié)果也是0.
  2. flex容器中的元素,即使是絕對定位,在沒有設(shè)定“top,left,right,bottom"等會變化位置的屬性前,受flex指定布局的擺布。
  3. 紅色塊 在高度為 0的 flex容器d2中,被設(shè)定為垂直居中,它現(xiàn)在完美的將自己的中心卡在了d2所在的水平線上。

本例中若想實現(xiàn)預(yù)期效果,稍作調(diào)整即可

  1. d1增加屬性

      box-sizing: border-box;
      position: relative;
  2. d2將position屬性值改為absolute
魚梓 回答

如果你兩個實體在代碼中有關(guān)聯(lián)關(guān)系,默認(rèn)情況下EF是級聯(lián)刪除的。
如果不是,那么你必須根據(jù)相關(guān)條件查找到要刪除的B然后手動刪除。

如果title不重復(fù),很簡單地做一下映射就可以了

db.test.find({"menu.title": '和梨一起'}, {name: 1, "menu.$": 1})

但是$只會給你第一個匹配的數(shù)組元素,所以如果title有重復(fù),則需要通過aggregation的filter運算符來處理。具體用法參考文檔中的例子。

帥到炸 回答

mysql-python不兼容python3。題主可以考慮使用pymysql或者是mysqlclient-python

九年囚 回答

當(dāng)你決定使用存儲過程的時候,那么整個事務(wù)是在MYSQL端完成的。

對于事務(wù)競爭優(yōu)化的主要一點就是減少事務(wù)鎖時間。

你選擇了使用存儲過程就可以不用再代碼中開啟事務(wù),深度優(yōu)化即將事務(wù)SQL在MYSQL端執(zhí)行(存儲過程)

以下是類似的秒殺事務(wù)落地的存儲過程

-- 秒殺執(zhí)行存儲過程
DELIMITER $$ -- ; 轉(zhuǎn)換為 $$
-- 定義存儲過程 in 輸入?yún)?shù)   out 輸出參數(shù)
-- ROW_COUNT 返回上一條修改類型sql(delete、insert、update)的影響函數(shù)
-- row_count 0 未修改數(shù)據(jù) >0修改的函數(shù) <0 SQL錯誤、未執(zhí)行修改sql
CREATE PROCEDURE `seckill`.`execute_seckill`
  (in v_seckill_id bigint,in v_phone bigint,
    in v_kill_time TIMESTAMP ,out r_result int)
  BEGIN
    DECLARE insert_count int DEFAULT 0;
    START TRANSACTION ;
    insert ignore into success_killed
      (seckill_id,user_phone,create_time)
      VALUES (v_seckill_id,v_phone,v_kill_time)
    select ROW_COUNT() into insert_count;
    if (insert_count = 0) THEN
      ROLLBACK;
      set r_result = -1;
    ElSEIF(insert_count < 0) THEN
      ROLLBACK;
      set r_result = -2;
    ELSE
      UPDATE seckill
      set number = number - 1
      where seckill_id = v_seckill_id
        and end_time > v_kill_time
        and start_time < v_kill_time
        and number > 0;
        SELECT row_count() into insert_count;
        if (insert_count = 0) THEN
          ROLLBACK;
          set r_result = 0;
        ElSEIF(insert_count < 0) THEN
          ROLLBACK;
          set r_result = -2;
        ELSE
          COMMIT;
          SET r_result = 1;
        END if;
    END if;
  END;
$$
-- 存儲過程定義結(jié)束

DELIMITER ;

set @r_result=-3;
-- 執(zhí)行存儲過程
call execute_seckill(1003,18820116735,now(),@r_result);

-- 獲取結(jié)果
select @r_result;

這屬于并發(fā)優(yōu)化的階段了,不要過度依賴存儲過程,其一般用于簡單的邏輯

空白格 回答

1、數(shù)據(jù)庫連接通過配置連接池來管理,不用特意去判斷連接是否正常,因為其會自動進(jìn)行重連操作
2、sync同步數(shù)據(jù)庫表結(jié)構(gòu)只需要在開始階段的執(zhí)行一次即可(只要表結(jié)構(gòu)與你的model對應(yīng),其實是不需要sync操作的),這種場景建議使用promise.all(放到app.js里執(zhí)行):

(async () => {
    try {
        await Promise.all([
            User.sync({force: false}),
            Order.sync({force: false}), 
            // ...      
        ]);
    } catch (error) {
        console.log(error);
    }
})();