Nazwa np. ground byłaby trafniejsza niż field, ale niech już będzie.
select * from field1;
+----+------+------------+
| id | kind | fruit |
+----+------+------------+
| 1 | A | apple |
| 2 | B | strawberry |
| 3 | C | pear |
| 4 | D | potato |
+----+------+------------+
select * from field2;
+----+------+-----------+
| id | kind | fruit |
+----+------+-----------+
| 1 | C | apple |
| 2 | B | pear |
| 3 | A | tomato |
| 4 | D | blueberry |
| 5 | E | coconut |
+----+------+-----------+
select field2.id, field2.kind, field2.fruit from field2 where field2.kind not in (select field1.kind from field1);
+----+------+---------+
| id | kind | fruit |
+----+------+---------+
| 5 | E | coconut |
+----+------+---------+
Nie raz problem lepiej opisać w ten sposób, niż ten, który zaprezentowałeś:
Jednym foreach'em umiem wylistować sobie pole do którego jest już dodany owoc.
...
Chciałbym porównać wszystkie pola z tymi, które są już dodane.
Moim zdaniem, szybciej można coś wywnioskować o co chodzi.
Możliwe, że istnieje alternatywa do powyższego zapisu SQL, ale tego musiałbyś poszukać sam.
http://www.mysqltutorial.org/sql-in.aspx