MySQL 在一行中选择多个 ID 值
MySQL selecting multi ids values in one row
这里是查询:
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
问题是 table t1 一些列(tiekejas、pirkejas、regionas、trasporto_imone、pard_vad、pirk_vad)是一组 id(例如。 1,2,5 等)。此查询 returns 值仅来自集合中的一个 id,我想将其全部放在一行中(换行中的每个值或用点或其他东西分隔,我可以稍后在程序中拆分它们)。现在我把它们分成程序,但我需要 select 从数据库中一个一个地提取它们,这会花费太多时间,而且程序运行速度太慢。
我希望有更好的解决方案。谢谢
这里是 SQL FIDDLE LINK: http://sqlfiddle.com/#!9/d8609/1
编辑:
http://postimg.org/image/3sostf42n/
这是我需要得到的,定义的列是t1.tiekejas(例如1,2,5),这个ids在table t3(tiekejai)中有值,通过这个查询它只returns id 1 的一个值,但我需要返回 id 1,2,5 的三个值。
您最初的问题可以使用 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
但是我认为您会对来自每个连接 table 的多个值产生疑问。此外,您正在使用 GROUP BY 来消除多行,并且未定义所选择的特定 invoice_nr / apm_id 的每列的各种值中的哪一个。
请注意,拥有一个包含以逗号分隔的 ID 列表的字段通常也不是一个好主意。它使连接变得比它应该做的更慢和更难(因为索引不能有效地在字段上使用),并且它限制了未来数据的增加。这通常是规范化数据库设计不佳的标志。
这里是查询:
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
问题是 table t1 一些列(tiekejas、pirkejas、regionas、trasporto_imone、pard_vad、pirk_vad)是一组 id(例如。 1,2,5 等)。此查询 returns 值仅来自集合中的一个 id,我想将其全部放在一行中(换行中的每个值或用点或其他东西分隔,我可以稍后在程序中拆分它们)。现在我把它们分成程序,但我需要 select 从数据库中一个一个地提取它们,这会花费太多时间,而且程序运行速度太慢。
我希望有更好的解决方案。谢谢
这里是 SQL FIDDLE LINK: http://sqlfiddle.com/#!9/d8609/1
编辑: http://postimg.org/image/3sostf42n/
这是我需要得到的,定义的列是t1.tiekejas(例如1,2,5),这个ids在table t3(tiekejai)中有值,通过这个查询它只returns id 1 的一个值,但我需要返回 id 1,2,5 的三个值。
您最初的问题可以使用 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
但是我认为您会对来自每个连接 table 的多个值产生疑问。此外,您正在使用 GROUP BY 来消除多行,并且未定义所选择的特定 invoice_nr / apm_id 的每列的各种值中的哪一个。
请注意,拥有一个包含以逗号分隔的 ID 列表的字段通常也不是一个好主意。它使连接变得比它应该做的更慢和更难(因为索引不能有效地在字段上使用),并且它限制了未来数据的增加。这通常是规范化数据库设计不佳的标志。