MySQL在一行中选择多个ID值

时间:2015-08-28 08:25:25

标签: mysql select set multi-select

这是查询:

SELECT 
     t1.id, t1.data, t1.invoice_nr, t3.tiekejas, t4.uzsakovas, t1.pard_suma, t1.pirk_suma,
     t1.transporto_suma, t2.apm_id, t2.apm_data, t2.apm_suma, t2.tipas, t1.terminas, 
     t5.regionas, t6.imone, t1.masina, t7.vardas, t7.pavarde, t8.vardas, t8.pavarde
FROM 
     irasai t1
     LEFT JOIN apmokejimai t2 ON t1.invoice_nr = t2.apm_invoice_nr
     LEFT JOIN tiekejai t3 ON t1.tiekejas = t3.id
     LEFT JOIN uzsakovai t4 ON t1.pirkejas = t4.id
     LEFT JOIN regionai t5 ON t1.regionas = t5.id
     LEFT JOIN transportas t6 ON t1.transporto_imone = t6.id
     LEFT JOIN vadybininkai t7 ON t1.pard_vad = t7.id
     LEFT JOIN vadybininkai t8 ON t1.pirk_vad = t8.id
GROUP BY t1.invoice_nr, t2.apm_id
ORDER BY t1.data, t1.invoice_nr

问题是表t1的一些列(tiekejas,pirkejas,regionas,trasporto_imone,pard_vad,pirk_vad)是一组id(例如1,2,5等)。这个查询只返回set中一个id的值,我希望在一行中得到它(新行中的每个值或用点或其他东西分隔,我可以在程序中稍后拆分它们)。现在我把它们分成了程序,但是我被要求从数据库中逐个选择它们,这需要花费太多时间,程序运行得太慢了。

我希望有更好的解决方案。感谢。

这里是SQL FIDDLE LINK:http://sqlfiddle.com/#!9/d8609/1

编辑: http://postimg.org/image/3sostf42n/

这就是我需要得到的,定义列是t1.tiekejas(例如1,2,5),这个id在表t3(tiekejai)中有值,通过这个查询它只返回id 1的一个值,但是我需要返回三个id值1,2,5。

1 个答案:

答案 0 :(得分:0)

您可以使用FIND_IN_SET解决初始问题: -

SELECT 
     t1.id, t1.data, t1.invoice_nr, t3.tiekejas, t4.uzsakovas, t1.pard_suma, t1.pirk_suma,
     t1.transporto_suma, t2.apm_id, t2.apm_data, t2.apm_suma, t2.tipas, t1.terminas, 
     t5.regionas, t6.imone, t1.masina, t7.vardas, t7.pavarde, t8.vardas, t8.pavarde
FROM 
     irasai t1
     LEFT JOIN apmokejimai t2 ON t1.invoice_nr = t2.apm_invoice_nr
     LEFT JOIN tiekejai t3 ON FIND_IN_SET(t3.id, t1.tiekejas)
     LEFT JOIN uzsakovai t4 ON FIND_IN_SET(t4.id, t1.pirkejas)
     LEFT JOIN regionai t5 ON FIND_IN_SET(t5.id, t1.regionas)
     LEFT JOIN transportas t6 ON FIND_IN_SET(t6.id, t1.transporto_imone)
     LEFT JOIN vadybininkai t7 ON FIND_IN_SET(t7.id, t1.pard_vad)
     LEFT JOIN vadybininkai t8 ON FIND_IN_SET(t8.id, t1.pirk_vad)
GROUP BY t1.invoice_nr, t2.apm_id
ORDER BY t1.data, t1.invoice_nr

但是我认为您将遇到来自每个联接表的多个值的问题。此外,您使用GROUP BY消除多行,并且未定义所选特定invoice_nr / apm_id的每列的各个值之一。

注意,让一个包含逗号分隔的id列表的字段通常也是一个坏主意。它使连接变得比它应该更慢和更难(因为索引不能在字段上有效地使用),并且它限制了数据的未来增加。这通常是数据库设计规范化程度不高的一个标志。