我有代码从数据库中生成四辆车及其照片:
$l=$database->query("SELECT car,brand,exactprice FROM $table ORDER BY rand() LIMIT 4");
$buffer="";
foreach($l as $l){
$buffer.="<li><h3>{$l['car']}</h3><p>Price {$l['exactprice']}</p>";
$k=$database->query("SELECT logo FROM logo WHERE brand='{$l['brand']}'");
$buffer.="<img src='{$base_addr}/{$k[0]['logo']}'><br>";
}
这是我目前的代码。我可以重写我的MySQL命令,这样我就可以从logo
获得logo
第一个选择吗?
目前加载此页面需要4.32秒。
答案 0 :(得分:5)
您没有提供$table
的内容,但无论哪种方式,您都可以在品牌列上使用JOIN
(假设此列是相应的外键)
SELECT $table.car, $table.brand, $table.exactprice, logo.logo
FROM $table JOIN logo ON $table.brand = logo.brand
ORDER BY rand() LIMIT 4
就性能而言,您可以考虑在频繁使用的列上创建索引,并在上面的查询前面添加EXPLAIN
进行基准测试。
一些参考文章:
答案 1 :(得分:1)
SELECT car, $table.brand, exactprice, logo FROM $table JOIN logo ON $table.brand=logo.brand ORDER BY rand() LIMIT 4
应该通过将brand
表加入查询来实现。
答案 2 :(得分:1)
将您的脚本更改为:
$l=$database->query("SELECT $table.car, logo.logo, $table.exactprice FROM $table join logo on logo.brand= $table.brand ORDER BY rand() LIMIT 4");
$buffer="";
foreach($l as $l){
$buffer.="<li><h3>{$l['car']}</h3><p>Price {$l['exactprice']}</p>";
$buffer.="<img src='{$base_addr}/{$l['logo']}'><br>
答案 3 :(得分:1)
目前有2个问题。首先,此查询应该完成using a JOIN。在其他答案中已经提到了这样做的查询,所以我不再重复了。
另外,如果你想知道为什么它很慢,它也与ORDER BY rand()
有关。为此,您可以查看This Stackoverflow question
答案 4 :(得分:1)
请通过执行以下操作修复SQL注入漏洞:
$allowed_tables = array('table1', 'table2');
$table = $_POST['table']; //or wherever table come from.
if (in_array($table, $allowed_tables)) {
$query = "SELECT car,brand,exactprice FROM `$table` ORDER BY rand() LIMIT 4";
$l=$database->query($query);
......
}
使用参数或mysql_real_escape_string()
对您没有帮助,因为您使用的是动态表名
另请参阅此问题:How to prevent SQL injection with dynamic tablenames?
答案 5 :(得分:1)
根据您的表格大小,索引和结构,您可能还有其他问题(请查看EXPLAIN SELECT
),但ORDER BY RAND()
中存在潜在问题 - 对整个表进行排序,调用{{1对于每一行,然后抛出大部分,并给你前四行;非常低效。但是,您可以使用子查询做一个巧妙的技巧,例如this one from @Jan Kneschke's article:
RAND()
请注意,只要没有任何已删除的行(或它们均匀分布),这只会为您提供随机分布的结果;这可能是也可能不是问题,具体取决于查询的目的。请参阅该文章进行深入讨论:http://jan.kneschke.de/projects/mysql/order-by-rand/
答案 6 :(得分:0)
选择汽车,品牌,exactprice,logo FROM $ table left join logo on($ table.brand = logo.brand)ORDER BY rand()LIMIT 4