本文目錄一覽:
mysql中的一些稍微複雜用法實例代碼
前言
mysql的語法相信對大家來說都不是難事,但是本文主要給分享了一些mysql複雜用法的相關內容,通過這篇文章相信大家會對mysql更深的了解一些,下面話不多說了,來一起看看詳細的介紹吧
一對多數據顯示成一行
GROUP_CONCAT(expr)
1、涉及的表關係:teacher表、teacher_subject_rel表(教師所能教的學科表)、subject表
2、業務場景:
需要拉取所有教師的編號(teacher_no)、學科名(subject_name)。
nbsp
教師表(teacher)和學科(teacher_subject_rel)是一對多關係,
往往查詢出現的是同一教師多條
數據。我們希望得到每個教師一條數據
學科拼接成一條
1、基本語法
group_concat(
[DISTINCT]
要連接的欄位
[Order
BY
排序欄位
ASC/DESC]
[Separator
‘分隔符’]
)
2、例子
SELECT
t.teacher_id
as
‘教師id’,
t.teacher_no
‘教師編號’,
(
SELECT
GROUP_CONCAT(s.subject_name)
FROM
teacher_subject_rel
tsr
LEFT
JOIN
`subject`
s
ON
tsr.subject_id
=
s.subject_id
WHERE
t.teacher_id
=
tsr.teacher_id
)
AS
‘學科’
FROM
teacher
t
子查詢、查詢臨時表、EXISTS
例子
SELECT
*
FROM
(
SELECT
o.id,
o.student_intention_id,
s.
NAME,
s.area_id,
a.area_name,
s.exam_year,
o.
STATUS,
CASE
o.
STATUS
WHEN
‘1’
THEN
‘待提交’
WHEN
‘2’
THEN
‘待指派’
WHEN
‘3’
THEN
‘已完成’
WHEN
‘4’
THEN
‘處理中’
END
statusName,
CASE
o.emergency_degree
WHEN
‘1’
THEN
‘正常’
WHEN
‘2’
THEN
‘緊急’
WHEN
‘3’
THEN
‘非常緊急’
END
emergencyDegreeName,
o.emergency_degree,
o.update_time,
(
SELECT
first_lesson_time
FROM
jx_strategy
WHERE
jx_lesson_plan_order_id
=
o.id
AND
STATUS
IN
(2,
7)
AND
first_lesson_time
now()
ORDER
BY
first_lesson_time
ASC
LIMIT
1
)
AS
first_time,
(
SELECT
deal_user_id
FROM
jx_strategy
WHERE
jx_lesson_plan_order_id
=
o.id
AND
STATUS
7
AND
deal_user_id
ORDER
BY
id
DESC
LIMIT
1
)
AS
deal_user_id
FROM
jx_lesson_plan_order
o
LEFT
JOIN
student
s
ON
s.student_intention_id
=
o.student_intention_id
LEFT
JOIN
area
a
ON
s.area_id
=
a.id
WHERE
o.
STATUS
1
AND
s.phone
=
‘18501665888’
AND
o.emergency_degree
=
1
AND
o.
STATUS
=
2
AND
s.exam_year
=
‘2015’
AND
o.update_time
=
‘2018-08-14
20:28:55′
AND
o.update_time
=
‘2018-08-14
20:28:55′
)
AS
a
WHERE
1
=
1
AND
a.deal_user_id
=
145316
AND
a.first_time
=
‘2018-08-17
00:00:00′
AND
a.first_time
=
‘2018-08-30
00:00:00′
AND
EXISTS
(
SELECT
*
FROM
jx_strategy
js
WHERE
js.jx_lesson_plan_order_id
=
a.id
AND
js.
STATUS
IN
(2,
7)
AND
js.subject_id
IN
(2,
3)
)
ORDER
BY
a.update_time
DESC
LIMIT
0,
10
update
關聯變數條件修改
1、涉及的表關係:
user_info表中的
id_number(身份證號)
teacher表中的birth欄位、
關聯關係usrer_id
=
teacher_id
2、業務場景:獲取用戶身份證上的出生日期將出生日期更新在birth欄位
UPDATE
teacher
t
INNER
JOIN
(
SELECT
t.teacher_id,
t.birth,
u.id_number,
CONCAT(SUBSTRING(u.id_number,
7,
4),
‘-‘,
SUBSTRING(u.id_number,
11,
2),
‘-‘,
SUBSTRING(u.id_number,
13,
2))
as
birth1,
u.reg_date,
t.exit_time
from
teacher
t
INNER
JOIN
user_info
u
ON
u.user_id
=
t.teacher_id
)
info
on
info.teacher_id
=
t.teacher_id
SET
t.birth
=
info.birth1
WHERE
info.reg_date
‘2018-08-20
00:00:00′
and
info.id_number
is
not
NULL
and
(info.birth
is
NULL
or
t.birth
=
”)
and
t.is_train
=
1
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
您可能感興趣的文章:MySQL在關聯複雜情況下所能做出的一些優化Mysql一些複雜的sql語句(查詢與刪除重複的行)深入mysql
“ON
DUPLICATE
KEY
UPDATE”
語法的分析MySQL
最基本的SQL語法/語句MySQL與Oracle的語法區別詳細對比淺析Mysql
Join語法以及性能優化MySQL
ALTER語法的運用方法MySQL
prepare語句的SQL語法MySQL進階SELECT語法篇MySQL
SQL
語法參考
php實現mysql封裝類示例
php封裝mysql類
複製代碼
代碼如下:
?php
class
Mysql
{
private
$host;
private
$user;
private
$pwd;
private
$dbName;
private
$charset;
private
$conn
=
null;
public
function
__construct()
{
$this-host
=
‘localhost’;
$this-user
=
‘root’;
$this-pwd
=
‘root’;
$this-dbName
=
‘test’;
$this-connect($this-host,$this-user,$this-pwd);
$this-switchDb($this-dbName);
$this-setChar($this-charset);
}
//負責鏈接
private
function
connect($h,$u,$p)
{
$conn
=
mysql_connect($h,$u,$p);
$this-conn
=
$conn;
}
//負責切換資料庫
public
function
switchDb($db)
{
$sql
=
‘use’
.
$db;
$this-query($sql);
}
//負責設置字符集
public
function
setChar($char)
{
$sql
=
‘set
names’
.
$char;
$this-query($sql);
}
//負責發送sql查詢
public
function
query($sql)
{
return
mysql_query($sql,$this-conn);
}
//負責獲取多行多列的select結果
public
function
getAll($sql)
{
$list
=
array();
$rs
=
$this-query($sql);
if
(!$rs)
{
return
false;
}
while
($row
=
mysql_fetch_assoc($rs))
{
$list[]
=
$row;
}
return
$list;
}
public
function
getRow($sql)
{
$rs
=
$this-query($sql);
if(!$rs)
{
return
false;
}
return
mysql_fetch_assoc($rs);
}
public
function
getOne($sql)
{
$rs
=
$this-query($sql);
if
(!$rs)
{
return
false;
}
return
mysql_fetch_assoc($rs);
return
$row[0];
}
public
function
close()
{
mysql_close($this-conn);
}
}
echo
‘pre’;
$mysql
=
new
Mysql();
print_r($mysql);
$sql
=
“insert
into
stu
values
(4,’wangwu’,’99998′)”;
if($mysql-query($sql)){
echo
“query成功”;
}else
{
echo
“失敗”;
}
echo
“br
/”;
$sql
=
“select
*
from
stu”;
$arr
=
$mysql-getAll($sql);
print_r($arr);
?
PHP避免向MySql添加重複記錄的實例代碼
最近寫了下英文搜索的小偷,為了讓蜘蛛更好的享受鏈接的樂趣,因此使用了入庫處理,將最近的搜索寫入到mysql中,同時在首頁調用這些查詢數據,就可以達到網站地圖的效果,但是弊端也出現了了,那就是重複記錄的問題。
在網上找到一段實例,經過修改發現可行,現將代碼公布如下:
$link=mysql_connect(『localhost』,』root』,』1234』);
//得到MySQL資料庫連接
$username=$_GET[“name”];
//得到從客戶端表單傳過來的數據
$q=”select
*
from
usertable
where
user_name=’$username'”;
mysql_query(“SET
NAMES
gb2312″);
//避免出現中文亂碼
$rs
=
mysql_query($q,
$link);
//查詢資料庫
$num_rows
=
mysql_num_rows($rs);
//得到查詢結果的總行數
if($num_rows==0)
//
烈火網
liehuo.net
歡迎複製,拒絕惡意採集
liehuo.net
{
$exec=”insert
into
student
(user_name)
values
($username)”;
mysql_query(“SET
NAMES
gb2312″);
mysql_query($exec,
$link);
//若沒有此用戶則將數據插入到資料庫(註冊用戶)
echo
“用戶註冊成功!”;
}
else
{
echo
“該用戶名已存在,請重新選擇用戶名!”;
}
?
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/199801.html