2

我有一个关于 VIEW 范围的问题。我是 mysql 新手,我正在创建一个包含汽车信息的网站。

这个特定 php 页面的设置是我从数据库中的几个表创建一个视图以显示给用户。然后,用户可以选择过滤数据以消除在规格方面不符合他/她要求的车辆。因此,随着每个过滤器的应用越来越少,剩下的车辆也越来越少。此过滤器通过更新页面部分的 AJAX 调用应用于原始 VIEW。

用户还可以选择重置他的选择并返回到原始页面选择,也可以使用 AJAX 调用。

因此,只要用户在页面中,我针对该特定用户的原始视图就需要保持“活动”状态。

问题是,希望网站上同时有很多访问者,访问同一个页面,并且可能同时创建同一个视图。

mysql 在这方面是如何工作的?每个用户创建的 VIEW 是否特定于该会话,或者来自不同用户的每个新 CREATE VIEW 将覆盖该 VIEW,然后造成混乱。在最后一种情况下,我怎样才能避免这个问题?

这样的视图可能不相关,但我将其包括在下面以防万一。

谢谢!

这来自页面 price_range.php:

mysql_query("CREATE OR REPLACE VIEW vprice_range AS(
SELECT 
brands.brand_id,
brands.brand,
models.model_id,
models.model,
segments.segment_id,
segments.segment,
versions.version_id,
versions.version,
versions.places,
motors.power,
motors.fuel as FUELTYPE,
measures.trunk,
cost_perf.to100,
cost_perf.maxspeed,
cost_perf.emission_co2,
cost_perf.mileagemix,
images.img_path,
prices.price,
prices.tag AS TAG1,
insurance.ins_yr1,
prices.matricule AS MATRICULE,
costs.tax_ct AS TAXES,
costs.fuel_ct AS FUEL,
costs.ins_ct AS INSURANCE,
costs.maint_ct AS MAINTENANCE,
costs.total_ct as Costs5yr,
(prices.matricule)+(prices.tag)+ (insurance.ins_yr1) as CostsAcq,
warranties.wr_year,
(COUNT(trimtype)) AS safety
FROM prices
INNER JOIN insurance USING (version_id)
INNER JOIN versions USING (version_id)
INNER JOIN costs USING (version_id)
INNER JOIN versiontrim USING(version_id)
INNER JOIN trims USING(trim_id)
INNER JOIN images USING (model_id)
INNER JOIN cost_perf USING ( cp_id)
INNER JOIN measures USING (measure_id)
INNER JOIN motors USING (motor_id)
INNER JOIN models USING (model_id)
INNER JOIN segments USING (segment_id)
INNER JOIN brands USING (brand_id)
INNER JOIN warranties USING(brand_id)
WHERE price BETWEEN $low AND $high
AND trimtype IN('sec', 'help')
AND models.active='Y'
AND versions.active='Y'
GROUP BY version_id
)");

然后是用户可以应用的过滤器,在同一个 price_range.php 中:

<div class="filter">
<h3>Refine your search with filter below:</h3>

<form id="filtermodel">

<p> Choose main specs:
<select id="powerselect" name="power" >
<option value="0"> cv plus que </option>
<option value="100">100 hp </option>
<option value="150">150 hp </option>
<option value="200">200 hp </option>
</select>

<select id="mileageselect" name="mileage" >
<option value="100"> Mileage moins que</option>
<option value="5">5l/100km </option>
<option value="6">6l/100km </option>
<option value="7">7l/100km </option>
</select>

<select id="co2select" name="co2" >
<option value="1000">Lower co2</option>
<option value="100"> 100 co2 </option>
<option value="150"> 150 co2 </option>
<option value="180"> 180 co2</option>
</select>

<select id="trunkselect" name="trunk" >
<option value="0">Bigger trunk </option>
<option value="300">300 l </option>
<option value="500">500 l </option>
<option value="700">700 l </option>
</select></p>
<p>Choose equipments:
<input class="hook1" type="checkbox" value="115" name="hook[0]"> Leather seats
<input class="hook1" type="checkbox" value="116" name="hook[1]"> Driver seat elect
<input class="hook1" type="checkbox" value="107" name="hook[2]"> Cruise control
</p>
<p> Cancel all selections: <input type="reset" id="reset" value=Reset /> </p>            
   </form>
4

1 回答 1

1

视图定义是一个持久对象,就像一个表。动态部分是当您尝试从中读取数据时。然后底层 SELECT 即时执行。

它的主要目的是封装一个复杂的查询,以便以后可以像普通表一样使用它,与命令式语言中的函数完全相同。您不会在每次需要完成某些事情时都创建一个函数,而是创建一个通用的参数化函数。根据具体情况,您可以使用不同的参数调用该函数。

除非您正在创建数据库管理工具,否则不要构建动态视图。相反,您可能希望在数据库中一劳永逸地创建此视图,但没有可变 WHERE条件。然后通过发出如下查询来使用代码中的视图:

SELECT * FROM vprice_range WHERE <variable condition>
于 2013-06-15T13:55:22.113 回答