我总是从SQL专家那里听说在SELECT语句中使用'*'符号效率不高,最好列出所有字段名称.
但是,在向表中添加新字段然后相应地更新所有存储过程时,我发现对我个人而言并不高效.
那么使用'*'有什么优缺点?
谢谢.
所以我想加入3张桌子.
我正在构建一个app i Codeigniter,我有3个表
客户:
-id
-phone_number
-hospital_id
-smc_status
-testing_center_id
医院
-id
-name
Testing_center
-id
-name
在模型中,我有这个:
public function get_clients()
{
if($slug === FALSE)
{
$this->db->select('clients.*');
$this->db->from('clients');
$this->db->join('hospital', 'clients.id = hospital.id');
$this->db->join('testing_center', 'clients.id = testing_center.id');
$query = $this->db->get();
return $query->result_array();
}
$query = $this->db->get_where('clients');
return $query->row_array();
}
Run Code Online (Sandbox Code Playgroud)
在视图中我有:
<tbody>
<?php foreach ($clients as $client_item): ?>
<tr>
<td><?php echo $client_item['phone_number'] ?></td>
<td><?php echo $client_item['smc_status'] ?></td>
<td><?php echo $client_item['hospital_id'] ?></td> //i wish to have the hospital name here
<td><?php echo $client_item['testing_center_id'] ?></td> …Run Code Online (Sandbox Code Playgroud) 假设我有2个表,一个叫做类别,一个叫做cat_pages.
类别表具有列ID,标题和时间戳.例如:
CREATE TABLE categories (
id INT UNSIGNED PRIMARY KEY,
title VARCHAR(32),
`timestamp` TIMESTAMP,
INDEX (title)
) Engine=InnoDB;
Run Code Online (Sandbox Code Playgroud)
cat_pages有2列,cat_id和page_id:
CREATE TABLE cat_pages (
cat_id INT UNSIGNED
REFERENCES categories (id)
ON DELETE CASCADE ON UPDATE CASCADE,
page_id INT UNSIGNED
REFERENCES pages (id)
ON DELETE CASCADE ON UPDATE CASCADE,
UNIQUE INDEX (cat_id, page_id),
INDEX (page_id, cat_id),
) Engine=InnoDB;
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用ID上的cat_pages表加入类别表,这样就可以了
查询:
SELECT * FROM categories as c
LEFT JOIN cat_pages as p ON c.id = p.cat_id
Run Code Online (Sandbox Code Playgroud)
生成一个重复多次类别的结果集(因为cat_pages表中有多个匹配项.我需要什么才能使每个类别只显示一次,如果cat_pages表中没有匹配则根本不显示?
假设我有以下MySQL视图:
create or replace view total_transactions(account_id, total) as
select
t.account_id,
ifnull(sum(t.value), 0) as total
from transactions t
where t.paid IS TRUE
group by t.bank_account_id;
Run Code Online (Sandbox Code Playgroud)
假设该帐户还没有任何交易,我希望该视图返回0.现在,如果我选择如下:
select * from total_transactions where account_id = 2060;
Run Code Online (Sandbox Code Playgroud)
并且帐户2060没有任何交易,它将不返回任何内容,而不是0.
我怎么能解决这个问题?
提前致谢.
我认为这可能是group by......
如果我执行我正在用于没有group by的视图的查询,它可以工作(即使没有结果也返回0),但如果我使用group by它,则为null:
select
t.account_id,
ifnull(sum(t.value), 0) as total
from transactions t
where t.paid IS TRUE
and account_id = 2060;
Run Code Online (Sandbox Code Playgroud)
返回0,和
create or replace view total_transactions(account_id, total) as
select
t.account_id,
ifnull(sum(t.value), 0) as total
from …Run Code Online (Sandbox Code Playgroud) 我可以轻松地从表中选择我的所有列:
SELECT * FROM foo
Run Code Online (Sandbox Code Playgroud)
但是,如果我要重命名的列bar中foobar,我需要手动指定的所有字段.如果向表中添加了新列,这会使我的查询不健壮:
SELECT a,b,c,d,bar AS foobar FROM foo
Run Code Online (Sandbox Code Playgroud)
是否有可能写出类似的东西
SELECT *, bar AS foobar from foo
Run Code Online (Sandbox Code Playgroud) 我用Google搜索了这个问题,似乎无法找到一致的意见,或许多基于可靠数据的意见.我只想知道在SQL SELECT语句中使用通配符是否会产生额外的开销,而不是单独调用每个项目.我已经在几个不同的测试查询中比较了两者的执行计划,似乎估计总是读取相同的.是否有可能在其他地方产生一些开销,或者它们是否真的处理相同?
我具体指的是:
SELECT *
Run Code Online (Sandbox Code Playgroud)
与
SELECT item1, item2, etc.
Run Code Online (Sandbox Code Playgroud) 我不想在这里假设,我以前被咬过/证明错了.
任何帮助,将不胜感激
哪个复合索引可以使这个简单的MySQL查询更快,我将如何创建该复合索引?
SELECT *
FROM `Table1`
WHERE `col1` = '145307'
AND `col2` = '0'
AND col3 NOT
IN ( 130209, 130839 )
ORDER BY col4 DESC
LIMIT 0 , 5
Run Code Online (Sandbox Code Playgroud)
上面(col1to col4)的每列上都有一个单独的索引.
编辑:
结果SHOW CREATE TABLE:
CREATE TABLE `Table1` (
`primaryCol` int(11) NOT NULL AUTO_INCREMENT,
`col3` int(11) DEFAULT '0',
`col5` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`col1` int(11) DEFAULT '0',
`col6` varchar(80) COLLATE utf8_bin DEFAULT NULL,
`col7` text CHARACTER SET …Run Code Online (Sandbox Code Playgroud) 我的数据库表有一个包含SQL时间戳的列(例如,2009-05-30 19:43:41).我需要在我的php程序中使用Unix时间戳等效(整数).
$posts = mysql_query("SELECT * FROM Posts ORDER BY Created DESC");
$array = mysql_fetch_array($posts);
echo $array[Created];
Run Code Online (Sandbox Code Playgroud)
它现在回应SQL时间戳,我想要一个Unix时间戳.是否有捷径可寻?
我想摆脱旧 mysql 扩展的束缚,我只是对数据库中的表进行测试 PDO 连接和简单查询。我似乎能够连接,(“连接成功”回声)但这就是美好时光结束的地方。我现在花了太多时间试图开始使用 PDO。
<?php
$host = 'localhost';
$port = '3306';
$username = 'user';
$password = 'blabla';
$database = 'workslist';
try {
$db = new PDO("mysql:host=$host; port = $port; dbname = $database", $username, $password);
echo 'connection successful<br />';
$query = 'SELECT * FROM main';
$statement = $db->prepare($query);
$statement->execute();
$results = $statement->fetchAll();
$statement->closeCursor();
foreach($results as $r){
echo $r['work'] . '<br />';
}
} catch (PDOException $e) {
echo 'Error!: ' . $e->getMessage() . '<br />';
die();
}
?>
Run Code Online (Sandbox Code Playgroud)
以上有什么问题吗? …