我对VIEW的范围有疑问。我是mysql的新手,我正在创建一个包含汽车信息的网站。
此特定php页面的设置是我从数据库中的几个表创建一个VIEW以向用户显示。 然后,用户可以选择过滤数据以消除在规格方面不符合他/她要求的车辆。因此,当应用每个过滤器时,剩下的车辆越来越少。 此过滤器通过AJAX调用应用于原始VIEW,该调用可更新页面的一部分。
用户还可以选择重置他的选择并返回原始页面选择,也可以使用AJAX调用。
因此,只要用户在页面中,我对该特定用户的原始VIEW就需要保持“实时”状态。
问题在于,希望网站上有很多访问者同时访问同一页面,并可能同时创建相同的VIEW。
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>
答案 0 :(得分:1)
视图定义是一个持久对象,就像一个表。动态部分是当您尝试从中读取数据时。然后在运行中执行基础SELECT。
它的主要目的是封装一个复杂的查询,以便以后可以像常规表一样使用它,与命令式语言中的函数完全相同。每次需要完成任务时都不会创建函数,而是创建一个通用的参数化函数。根据具体情况,您可以使用不同的参数调用该函数。
除非您要创建数据库管理工具,否则不要构建动态视图。相反,您可能希望在数据库中一劳永逸地创建此视图,但不包含变量 WHERE
条件。然后通过发出以下查询来使用代码中的视图:
SELECT * FROM vprice_range WHERE <variable condition>