मैं एक क्वेरी बनाने की कोशिश कर रहा हूं, जो एक टेबल से tipo_id लौटाती है, इसके मूल्य के आधार पर मैं किसी अन्य टेबल से जुड़ना चाहता हूं, उदाहरण के लिए यदि tipo_id 1 है तो मैं टेबल के साथ जुड़ना चाहता हूं जिसे कहा जाता है p_read अगर tipo_id मैं शामिल होना चाहता हूं tv_read

यही मैंने करने की कोशिश की।

SELECT ec.id,ec.estado,fv.id,fv.num_factura,fv.importe,fv.iva,fv.total,fv.fecha_consumo_inicio,fv.fecha_consumo_fin,
fv.fecha_factura, fv.fichero, c.total, l.tipo_id, lp.id_consumo FROM aldroges8.factura_venta fv
INNER JOIN aldroges8.lectura l ON fv.id=l.facturaVenta_id
INNER JOIN aldroges8.factura_cobro fc ON fc.facturaventa_id = fv.id
INNER JOIN aldroges8.cobros c ON c.id=fc.cobros_id
INNER JOIN aldroges8.estado_cobros ec ON ec.id = c.estado
IF (l.tipo_id=1)
 INNER JOIN aldroges8.lectura_potencia lp ON l.id=lp.id
ELSE IF (l.tipo_id =3)
 INNER JOIN aldroges8.lectura_tv_gas lp ON lp.id=l.id 
WHERE fv.factura_enviada=1 AND fv.suministro_id=:id_contrato ORDER BY fv.fecha_factura DESC;

लेकिन मुझे यह त्रुटि मिल रही है।

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF (l.tipo_id==1)
 INNER JOIN aldroges8.lectura_potencia lp ON l.id=lp.id
ELSE' at line 7

इसलिए मैं जानना चाहता हूं कि क्या ऐसा करने का कोई तरीका है यदि किसी प्रश्न पर बयान दिया जाता है, या क्या मुझे tipo_id के साथ कोई अन्य प्रश्न करने की आवश्यकता है, अग्रिम धन्यवाद

0
Jaime Cuellar 8 मई 2018, 12:17

2 जवाब

सबसे बढ़िया उत्तर

मैं इसे on खंड में शर्त के साथ लिखूंगा और फिर coalesce() का उपयोग select में करूंगा:

SELECT ec.id, ec.estado, fv.id, fv.num_factura, fv.importe, fv.iva, 
       fv.total, fv.fecha_consumo_inicio, fv.fecha_consumo_fin,
       fv.fecha_factura, fv.fichero, c.total, l.tipo_id, 
       coalesce(lp_1.id_conumo, lp_3.id_consumo)  as id_consumo
FROM aldroges8.factura_venta fv INNER JOIN
     aldroges8.lectura l
     ON fv.id = l.facturaVenta_id INNER JOIN
     aldroges8.factura_cobro fc
     ON fc.facturaventa_id = fv.id INNER JOIN
     aldroges8.cobros c
     ON c.id = fc.cobros_id INNER JOIN
     aldroges8.estado_cobros ec
     ON ec.id = c.estado LEFT JOIN
     aldroges8.lectura_potencia lp_1
     ON l.id = lp_1.id AND l.tipo_id = 1 LEFT JOIN
     aldroges8.lectura_tv_gas lp_3
     ON lp_3.id = l.id AND l.tipo_id = 3
WHERE fv.factura_enviada = 1 AND
      fv.suministro_id = :id_contrato
ORDER BY fv.fecha_factura DESC;

एक CASE अभिव्यक्ति में ON छंदों में तुलना करने के बीच का अंतर सूक्ष्म लग सकता है, लेकिन यह महत्वपूर्ण हो सकता है।

यदि दोनों में से किसी भी तालिका में एक से अधिक मिलान हैं, तो शर्त को SELECT में रखने से परिणाम डुप्लिकेट पंक्तियाँ बन जाएँगी।

1
Gordon Linoff 8 मई 2018, 13:49
SELECT ec.id,ec.estado,fv.id,fv.num_factura,fv.importe,fv.iva,fv.total,fv.fecha_consumo_inicio,fv.fecha_consumo_fin,
fv.fecha_factura, fv.fichero, c.total, l.tipo_id, 
/* Used case when statement to get the required result in that column */ 
case when l.tipo_id=1 then lp_1.id_consumo 
     when l.tipo_id=3 then lp_3.id_consumo end  as id_consumo
FROM aldroges8.factura_venta fv
INNER JOIN aldroges8.lectura l ON fv.id=l.facturaVenta_id
INNER JOIN aldroges8.factura_cobro fc ON fc.facturaventa_id = fv.id
INNER JOIN aldroges8.cobros c ON c.id=fc.cobros_id
INNER JOIN aldroges8.estado_cobros ec ON ec.id = c.estado
left join  aldroges8.lectura_potencia lp_1 ON l.id=lp_1.id
left join aldroges8.lectura_tv_gas lp_3 ON lp_3.id=l.id 
WHERE fv.factura_enviada=1 AND fv.suministro_id=:id_contrato ORDER BY fv.fecha_factura DESC;
2
Fahad Anjum 8 मई 2018, 12:38