我有一张有客人的桌子,电话号码和传真号码。客户可以有多个电话号码和传真号码。当我选择客户数据时
SELECT customer.FirstName, customer.Id, phone.Phonenumber, fax.Faxnumber
FROM customer
LEFT JOIN phone ON customer.Id = phone.CustomerId
LEFT JOIN fax ON customer.Id = fax.CustomerId
WHERE customer.Id =7
LIMIT 0 , 30
因为这个客户有2个电话号码和2个传真号码,所以我可以退4行。
FirstName Id Phonenumber Faxnumber
Wim 7 090-123-1248 093-123-1234
Wim 7 090-123-1248 093-123-1235
Wim 7 090-123-1249 093-123-1234
Wim 7 090-123-1249 093-123-1235
有什么办法只得到一次电话号码和传真号码吗?像这样
FirstName Id Phonenumber Faxnumber
Wim 7 090-123-1248 093-123-1234
Wim 7 090-123-1249 093-123-1235
我一直在阅读不同的内容,但没有找到解决办法。
发布于 2013-12-25 22:37:08
尝试GROUP_CONCAT
和distinct
。
SELECT
customer.FirstName,
customer.Id,
GROUP_CONCAT(distinct phone.Phonenumber),
GROUP_CONCAT(distinct fax.Faxnumber)
FROM customer
LEFT JOIN phone ON customer.Id = phone.CustomerId
LEFT JOIN fax ON customer.Id = fax.CustomerId
WHERE customer.Id = 7
GROUP BY customer.id
LIMIT 0 , 30
它会给你这样的东西:
FirstName Id Phonenumber Faxnumber
Wim 7 090-123-1248,090-123-1249 093-123-1234,093-123-1235
然后,您就可以轻松地将Phonenumber和Faxnumber爆炸到程序中的数组中。
发布于 2013-12-25 22:52:06
你可以这样做,但这并不像GROUP_CONCAT的答案。sqlFiddle
SELECT customer.FirstName, customer.Id, p.Phonenumber, f.Faxnumber
FROM customer
LEFT JOIN (SELECT phoneNumber,
customerId,
IF (@prevCustomer != customerId,@row:=1,@row:=@row+1)
as row,
@prevCustomer := customerId
FROM phone,(SELECT @row:=0,@prevCustomer:=0)r
ORDER BY customerId)as p
ON customer.Id = p.CustomerId
LEFT JOIN (SELECT faxNumber,
customerId,
IF (@prevCustomer != customerId,@row:=1,@row:=@row+1)
as row,
@prevCustomer := customerId
FROM fax,(SELECT @row:=0,@prevCustomer:=0)r
ORDER BY customerId)f
ON customer.Id = f.CustomerId
AND (p.row = f.row OR p.row IS NULL)
WHERE customer.Id = 7
LIMIT 0 , 30
它适用于电话号码与传真号码相等或更多的情况。如果你有更多的传真号码,那么电话号码就不会显示额外的传真号码。所以我建议你使用GROUP_CONCAT
的答案。这更安全。
发布于 2013-12-25 22:32:57
可以将"group by“添加到分组电话行,因此您的SQL如下所示
SELECT customer.FirstName, customer.Id, phone.Phonenumber, fax.Faxnumber
FROM customer
LEFT JOIN phone ON customer.Id = phone.CustomerId
LEFT JOIN fax ON customer.Id = fax.CustomerId
WHERE customer.Id =7
GROUP BY phone.Phonenumber,fax.Faxnumber
LIMIT 0 , 30
https://stackoverflow.com/questions/20780147
复制