Rumah > Soal Jawab > teks badan
Pertanyaan bersama berbilang jadual + subkueri + pertanyaan bersyarat + pengisihan
SELECT
ac.*,
c.car_number,
c.car_name,
cs.car_source,
cb.brand_name,
cm.car_model,
ct.car_type,
c.number_plate,
(
SELECT
COUNT(ar.auction_record_id)
FROM
csp_auction_record AS ar
WHERE
ac.auction_car_id = ar.auction_car_id
) AS auction_count
FROM
csp_auction_car AS ac
INNER JOIN
csp_car AS c
ON
ac.car_id = c.car_id
INNER JOIN
csp_car_brand AS cb
ON
c.car_brand_id = cb.car_brand_id
INNER JOIN
csp_car_source AS cs
ON
c.car_source_id = cs.car_source_id
INNER JOIN
csp_car_type AS ct
ON
c.car_type_id = ct.car_type_id
INNER JOIN
csp_car_model AS cm
ON
c.car_model_id = cm.car_model_id
WHERE
ac.auction_s_time <= CURRENT_TIMESTAMP AND ac.auction_e_time >= CURRENT_TIMESTAMP
ORDER BY
ac.auction_car_id
DESC
LIMIT 0, 10
Lembaran data berkaitan:
csp_car_brand
, senarai jenama kenderaan:
csp_car_type
, jadual jenis kenderaan:
csp_car_source
, jadual sumber kenderaan:
csp_car_model
, meja model kenderaan (model khusus jenama):
csp_car
, meja kenderaan (meja ini terlalu banyak medan, cuma ada yang tersenarai)
csp_auction_record
, senarai rekod lelongan:
Adakah terdapat sebarang masalah prestasi dengan pernyataan sql ini? ? Bagaimana untuk mengoptimumkan? ? Patutkah saya menggunakan PHP untuk membahagikannya kepada pernyataan SQL mudah dan kemudian menggabungkan hasilnya, atau apa? ?
phpcn_u15822017-05-24 11:32:34
Sejak anda bertanya ini, bermakna anda tahu ada masalah dengan sql anda. Masalahnya ialah jadual csp_auction_record diimbas seberapa kerap yang terdapat dalam jadual csp_auction_car. Seram untuk memikirkannya, tetapi saya melihat ramai orang suka menulisnya seperti ini. Juga, cuba tuliskan keadaan di mana dalam subquery Jumlah data dalam jadual ac akan dikurangkan dengan banyak, dan perkaitan seterusnya akan menjadi lebih cepat.
Boleh ditukar kepada yang berikut, jadual csp_auction_record hanya diimbas sekali sahaja
SELECT ac.*,
c.car_number,
c.car_name,
cs.car_source,
cb.brand_name,
cm.car_model,
ct.car_type,
c.number_plate,
IFNULL(ar.count, 0) AS auction_count
FROM (select *
from csp_auction_car
WHERE auction_s_time <= CURRENT_TIMESTAMP
AND auction_e_time >= CURRENT_TIMESTAMP) AS ac
INNER JOIN csp_car AS c
ON ac.car_id = c.car_id
INNER JOIN csp_car_brand AS cb
ON c.car_brand_id = cb.car_brand_id
INNER JOIN csp_car_source AS cs
ON c.car_source_id = cs.car_source_id
INNER JOIN csp_car_type AS ct
ON c.car_type_id = ct.car_type_id
INNER JOIN csp_car_model AS cm
ON c.car_model_id = cm.car_model_id
left outer join (select auction_car_id, count(*) count
from csp_auction_record
group by auction_car_id) ar
on ac.auction_car_id = ar.auction_car_id
ORDER BY ac.auction_car_id DESC LIMIT 0, 10